关于Python 2.7 multiprocessing.Queue.get()返回完整对象的疑问
关于Python 2.7 multiprocessing Queue.get()返回完整对象的说明
嘿,放心好了!multiprocessing.Queue.get()绝对会返回你放入队列的完整对象,完全不用担心拿到对象片段的情况。
原因很简单:multiprocessing队列在传递对象时,是基于Python的pickle模块做序列化/反序列化的。当你调用Queue.put(obj)时,整个对象会被完整序列化成字节流,然后作为一个“完整项目”存入队列;而调用get()时,队列会取出这个完整的字节流,再反序列化成原本的对象返回给你。
官方文档里说的“从队列中移除并返回一个项目”,这里的“项目”就是指你当初put进去的那个完整对象——不管这个对象是小到一个整数,还是大到一个包含大量数据的自定义类实例、巨型字典,get()都会完整地返回它,不会出现拆分、截断的情况。
举个实际的例子,哪怕你在子进程里put一个100MB的列表进去,父进程调用get()拿到的也会是这个完整的列表,不会只拿到前半部分或者某个片段。
当然要注意,Python 2.7的pickle有一些自身的限制(比如对某些复杂对象的序列化支持不如Python 3),但这和队列是否会拆分对象无关——只要你的对象能被成功pickle,队列就会完整地传递它。
内容的提问来源于stack exchange,提问作者alive-and-well
相关产品推荐
相关产品推荐

