【发布时间】:2021-06-17 20:59:26
【问题描述】:
我试图了解多处理在 python 中的工作原理,我遇到了一个用例,我想从队列系统中读取一些消息并将它们写入数据库。
在最终循环中不使用p.join() 可以吗?这是因为当我省略这个连接时,我看到的速度要快得多;
或者它的后果是什么?
我没有更多的代码。
def process():
while True:
message = read_from_queue()
write_to_database(message)
for _ in range(4):
p = Process(target=process)
p.start()
【问题讨论】:
-
join()是您真正等待结果返回的时间。如果您不调用它,您的程序可能会在所有工作实际完成之前退出。 -
你应该在你执行
start的循环之后join(在一个单独的循环中),而不是在它里面。将Process实例附加到列表中,以便您可以再次循环,执行join。 -
问题是,有一个永远不会结束的 While 循环,因此外部连接永远不会发生
-
如果不调用
join,操作系统会继续跟踪进程。如果您经常这样做,那么您有可能会耗尽流程资源。当您的父程序退出时,它会调用join。如果您的子进程永远持续下去,则父进程也不会完全退出。您可以设置Process.daemon标志,但在这种情况下,您的父进程将在退出时终止子进程。 -
我觉得你现在做的还可以。您启动 4 个进程,当您的顶级脚本退出时,它会在后台加入。这里似乎缺少的是对这些子进程的管理——它们是如何终止的? - 但由于这是一个简单的例子,我也不希望有额外的细节。
标签: python multiprocessing python-multiprocessing