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

标签 python multithreading multiprocessing gil

出于多种原因(GIL、内存泄漏),我需要将 threading 应用程序转换为 multiprocessing 应用程序。幸运的是,线程是完全隔离的,并且只能通过 Queue.Queue 进行通信。此原语在 multiprocessing 中也可用,所以一切看起来都很好。现在,在我进入这个雷区之前,我想就即将出现的问题获得一些建议:

  1. 如何确保我的对象可以通过Queue 传输?我需要提供一些 __setstate__ 吗?
  2. 我能否依靠 put 立即返回(就像使用 threading Queue 一样)?
  3. 一般提示/技巧?
  4. Python documentation 之外的任何值得一读的内容?

最佳答案

第 1 部分的答案:

必须通过multiprocessing.Queue(或Pipe 或其他)的所有内容都必须是picklable .这包括基本类型,例如 tuplelistdict。如果类是顶级的并且不太复杂(查看详细信息),则它们也受支持。然而,尝试传递 lambda 会失败。

第 2 部分的答案:

put 由两部分组成:它需要一个信号量来修改队列,并且它可以选择启动一个供给线程。因此,如果没有其他 Process 尝试同时 put 到同一个 Queue (例如因为只有一个 Process 写入它),它应该很快。对我来说,事实证明它足够快,可以满足所有实际目的。

第 3 部分的部分答案:

  • 普通的multiprocessing.queue.Queue 缺少task_done 方法,因此不能直接用作替代品。 (子类提供该方法。)
  • 旧的 processing.queue.Queue 缺少 qsize 方法,而较新的 multiprocessing 版本不准确(请记住这一点)。
  • 由于文件描述符通常在 fork 上继承,因此需要注意在正确的进程中关闭它们。

关于python - 如何将 Python 线程代码转换为多处理代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4097227/

相关文章:

java - Android 线程错误 - 无法在未调用 Looper.prepare() 的线程内创建处理程序

java - Java中如何验证线程中的命令是否成功启动并且另一个线程可以启动?

python - 多处理 -> pathos.multiprocessing 和 windows

python - 在pytest中人为地提前时间

python - 根据条件从 pandas 系列中删除重复项

python - 获取值错误: invalid literal for int() with base 10: '' during conversion of string

python - 从两个 Pandas 字段创建字典字段

C++11 线程等待行为:std::this_thread::yield() 与 std::this_thread::sleep_for( std::chrono::milliseconds(1) )

python - Tornado Web 服务器和多线程共享问题

python - 多处理问题