我正在编写一个脚本,将使用Python的多进程和线程模块。为了您的理解,我会生成与可用核心数量相等的进程,并在每个进程内部启动25个线程。每个线程从
在我的第一次测试后,我出现了死锁,因为负责喂养和刷新队列的线程挂起了。过了一段时间,我发现可以使用
但是由于存在数据丢失的可能性,我想使用:
感谢您的帮助。
input_queue
中消耗并生产到output_queue
。对于队列对象,我使用multiprocessing.Queue
。在我的第一次测试后,我出现了死锁,因为负责喂养和刷新队列的线程挂起了。过了一段时间,我发现可以使用
Queue().cancel_join_thread()
来解决这个问题。但是由于存在数据丢失的可能性,我想使用:
multiprocessing.Manager().Queue()
现在的问题是:
使用一个管理器对象来处理每个队列是否更好?还是应该创建一个管理器并从同一个管理器对象中获取两个队列?# One manager for all queues
import multiprocessing
manager = multiprocessing.Manager()
input_queue = manager.Queue()
output_queue = manager.Queue()
...Magic...
# As much managers as queues
manager_in = multiprocessing.Manager()
queue_in = manager_in.Queue()
manager_out = multiprocessing.Manager()
queue_out = manager_out.Queue()
...Magic...
感谢您的帮助。
__init__
中加了一行代码print("pid: {}".format(os.getpid()))
,结果发现所有这样创建的进程都有相同的 pid,因此共享同一内存?如何使用相同的排队机制创建不同的进程? 我尝试了:workers = [Process(target = Worker, args = ((str(name), inq, outq))) for name in range(3)]
但是工作进程似乎无法从 'inq' 收到消息。 非常感谢您的帮助! - Jimmyprint
放入 Worker 进程的run(..)
方法中。你会发现这段代码正在不同的进程中运行,因此它们确实是不同的进程。我现在找不到一个好的链接,但是虽然__init__
在主进程上运行,但还有另一个进程被forked/spawned
,并且那里将执行run
。 - Paul