Python3之无法在进程池中使用队列Queue的解决方案
来源:互联网 发布:如何测试80端口 编辑:程序博客网 时间:2024/05/21 09:44
import multiprocessingimport timeclass Test: def __init__(self): self.pool = multiprocessing.Pool() # self.queue = multiprocessing.Queue() m = multiprocessing.Manager() self.queue = m.Queue() def subprocess(self): for i in range(10): print("Running") time.sleep(1) print("Subprocess Completed") def start(self): self.pool.apply_async(func=self.subprocess) print("Subprocess has been started") self.pool.close() self.pool.join() def __getstate__(self): self_dict = self.__dict__.copy() del self_dict['pool'] return self_dict def __setstate__(self, state): self.__dict__.update(state)if __name__ == '__main__': test = Test() test.start()
主要是这两行代码:
m = multiprocessing.Manager()self.queue = m.Queue()
A manager object returned by Manager() controls a server process which holds Python objects and allows other processes to manipulate them using proxies.
A manager returned by Manager() will support types list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array.
共享数据主要通过在内存中共享某个数据类型实现的,共享数据类型比较多:列表,字典,同步锁,递归锁,信号量,时间,还有队列等,这个进程池用的就是共享数据的队列类型数据
话说__getstate__和__setstate__是什么鬼?
这个是Python中有些无法被pickle序列化的对象,调用这两个方法后就可以进行pickle序列化和反序列化处理处理。示例:
class Foo(object): def __init__(self, val=2): self.val = val def __getstate__(self): # print("I'm being pickled") self.val *= 2 print(self.__dict__) return self.__dict__ print('=--------->') def __setstate__(self, d): # print("I'm being unpickled with these values:", d) self.__dict__ = d # self.val *= 3 # pass print('============>')import picklef = Foo()f_string = pickle.dumps(f)f_new = pickle.loads(f_string)print(f_new.val)
上面的示例可以很好的解释了__getstate__和__setstate__用法,Python 将只 pickle 当它调用该实例的__getstate__() 方法时返回给它的值,在 unpickle 时,Python 将提供经过 pickle 的值作为参数传递给实例的__setstate__() 方法。在 __setstate__() 方法内,可以根据经过 pickle 的名称和位置信息来重建对象,并将该对象分配给这个实例的 属性。
这个博客写的超级赞:
pickle序列化全接触
- Python3之无法在进程池中使用队列Queue的解决方案
- mysqldb在python3下无法使用的解决方案
- 解决python进程池中无法使用multiprocessing.Queue
- Python3之队列Queue、Process补充
- stl之queue(队列)的使用
- java中queue的-- 队列使用
- Python3.5 在Ubuntu16.04上无法画图的解决方案
- java中使用队列 Queue
- java中Queue队列的介绍和使用(1)之LinkedList
- java中Queue队列的使用和介绍(2)之PriorityQueue
- $.getJson()在IE中无法使用解决方案
- 单向队列queue的使用
- c# Queue 队列的使用
- STL 队列queue的使用
- java 队列 Queue 的使用
- STL库之queue队列使用
- java中使用队列:java.util.Queue
- java中使用队列:java.util.Queue
- 27-SpringBoot——核心-声明式事务
- lua 实现面向对象
- 获取网络字符串及图片
- linux内存管理之伙伴系统
- 引导页
- Python3之无法在进程池中使用队列Queue的解决方案
- 幻方判定
- 使用GDI+加载PNG(MFC)
- 侧
- Nature:拟南芥微生物组功能研究2细菌基因组测序和分析
- 如何将音频放慢
- 四种补间动画,组合动画
- 左右侧拉
- Python安装和运行Scrapy中的两个问题