Python Queue在Pool的多进程中的共享方式

​ 今天使用Pool使用Queue来传递数据的时候报错:

Queue objects should only be shared between processes through inheritance

​ 后来研究了一下发现网上的教程大部分是要求用mp包里的Manager来构建一个proxy来使用Queue,但其实解决这个错误不一定需要使用Manager.Queue,这个错误报错的地方其实是在fork的时候,把Queue对象作为参数传进给子进程导致的错误。所以使用继承的方式来传递这个对象就可以了。

​ 这里介绍一下Python的三种共享对象的方式:

共享方式 支持的类型
Shared memory ctypes当中的类型,通过RawValue,RawArray等包装类提供
Inheritance 系统内核对象,以及基于这些对象实现的对象。包括Pipe, Queue, JoinableQueue, 同步对象(Semaphore, Lock, RLock, Condition, Event等等)
Server process 有对象,可能需要自己手工提供代理对象(Proxy)

​ 如果使用Manager.Queue就是使用第三种Server process方式来共享对象啦,但是直接使用第一种Shared memory方式来共享对象会更简单。

​ 所以解决方法很简单,在所有进程Pool可以访问的代码块中新建一个Queue就OK了,这样所有进程在fork的时候复制到的资源描述符其实都是直接指向主进程穿件的Queue的,而且同时这些进程也是他们的子进程,所以可以访问Queue而且也不会报错。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、进程的概念 相信很多同学都听说过windows、linux,MacOS都是多任务,多用户的操作系统。那什么是多...
    转身后的那一回眸阅读 4,569评论 0 1
  • 1.进程 1.1多线程的引入 现实生活中 有很多的场景中的事情是同时进行的,比如开车的时候手和脚共同来驾驶汽车,再...
    TENG书阅读 3,856评论 0 0
  • 1.1.1多任务的引入 什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务。打个比方,你一边在用浏览器...
    PythonMaO阅读 3,635评论 0 1
  • 刚开始写晨读感悟时,看了有想法,但是要表达出来,刚开始,总写不出来,要思考好久好久。 后来,看个两遍,差不多成稿。...
    微努力阅读 1,534评论 0 0
  • 就那么潇洒地背起你的帆布包 没有回头 没有挥挥手 我送你一方小手帕 每一个疲惫的夜晚 试着擦擦风霜浸透的浓发 你说...
    秋之语阅读 3,089评论 6 6