Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Python线程代码转换为多处理代码?_Python_Multithreading_Multiprocessing_Gil - Fatal编程技术网

如何将Python线程代码转换为多处理代码?

如何将Python线程代码转换为多处理代码?,python,multithreading,multiprocessing,gil,Python,Multithreading,Multiprocessing,Gil,由于多种原因(GIL、内存泄漏),我需要将线程应用程序转换为多处理应用程序。幸运的是,这些线程非常孤立,只能通过Queue.Queues进行通信。此原语也可在多处理中使用,因此一切看起来都很好。现在,在我进入这个雷区之前,我想就即将出现的问题获得一些建议: 如何确保可以通过队列传输我的对象?我是否需要提供一些\uuuuu setstate\uuuu 我是否可以依靠put立即返回(如线程化队列s) 一般提示/提示 除了这本书,还有什么值得一读的吗 对第一部分的答复: 必须通过多处理.队列(或管道或

由于多种原因(GIL、内存泄漏),我需要将
线程
应用程序转换为
多处理
应用程序。幸运的是,这些线程非常孤立,只能通过
Queue.Queue
s进行通信。此原语也可在
多处理中使用,因此一切看起来都很好。现在,在我进入这个雷区之前,我想就即将出现的问题获得一些建议:

  • 如何确保可以通过
    队列
    传输我的对象?我是否需要提供一些
    \uuuuu setstate\uuuu
  • 我是否可以依靠
    put
    立即返回(如
    线程化
    队列
    s)
  • 一般提示/提示
  • 除了这本书,还有什么值得一读的吗
  • 对第一部分的答复:

    必须通过
    多处理.队列
    (或
    管道
    或任何东西)的所有内容都必须。这包括基本类型,如
    tuple
    s、
    list
    s和
    dict
    s。如果类是顶级的且不太复杂,则也支持这些类(请查看详细信息)。但是,尝试传递
    lambda
    s将失败

    对第2部分的答复:

    一个
    put
    由两部分组成:它使用一个信号量来修改队列,并且可以选择启动一个feeder线程。因此,如果没有其他
    进程
    试图同时
    放入同一
    队列
    (例如,因为只有一个
    进程
    正在写入),那么它应该很快。对我来说,它的速度足以满足所有实际用途

    对第3部分的部分答复:

    • 普通的
      multiprocessing.queue.queue
      缺少
      task\u done
      方法,因此它不能直接用作插入式替换。(一个子类提供了该方法。)
    • 旧的
      processing.queue.queue
      缺少
      qsize
      方法,新的
      多处理
      版本不准确(请记住这一点)
    • 由于文件描述符通常在
      fork
      上继承,因此需要注意在正确的过程中关闭它们

    子类(进程)中初始化数据库连接。\uuu init\uuuu
    是一个问题:-/另一个用户最近用多处理库重写了我的线程示例。我也在使用队列。可能值得一看: