【问题标题】:Using join() in python multiprocessing在 python 多处理中使用 join()
【发布时间】:2015-09-24 01:40:35
【问题描述】:

我的问题与以下代码有关:

import multiprocessing
import math
import time


def do_work():

   for i in range(1,10,1):
      math.cos(i)


workers = [ multiprocessing.Process(target=do_work) for i in xrange(20) ]

for t in workers:
    t.daemon = True
    t.start()

time.sleep(100) # put here to simply indicate main is busy doing something

for t in workers:
    print t.name + " joining"
    t.join()

如您所见,我的父进程在加入子进程之前已经休眠了很长时间。而且我的子进程运行得非常快。

问题是:

如上例所示,在加入子进程之前,主进程可以等待很长时间吗?当主进程加入时,子进程是否有变成僵尸的危险?这段代码有问题吗?这在某种程度上是坏代码吗?我该如何改进它?

我的尝试:

我试图研究这种行为。我觉得没问题。但我想一旦我确实看到一个子进程变成了僵尸,至少ps 的输出表明了这一点。

【问题讨论】:

  • 为什么主进程在等待?你是在主进程中做一些实际的工作,还是真的在睡觉?如果是后者,join() 方法将为您完成睡眠,并且可能更有效。
  • 在主线程中调用t.join() 以获得“已经完成”t 没有害处。但是,一般的原则是在启动子线程后加入,以便让主线程等待子线程完成其任务。
  • @Kevin 我添加了一条评论。只需考虑 main 在加入子进程之前必须做一些工作。

标签: python python-2.7 process parallel-processing multiprocessing


【解决方案1】:

如果其父进程没有确认其退出状态而死亡,则该进程将成为僵尸。例如,如果您使用 KILL 信号强制终止脚本,则可能会发生这种情况。

如果您的父进程正忙于做其他事情并且不能在子进程退出后立即调用join() 完全没问题。

问题是当您继续创建流程而不加入旧流程时。在这种情况下,您的操作系统中的资源很快就会用完。

在您的具体示例中,由于子进程被设置为守护进程,并且您在某个时间点加入它们,因此根本没有任何危害。请记住,join() 会一直阻塞,直到给定进程过期,因此您无需休眠即可等待它。

【讨论】:

  • 您的意思是:“请记住,join() 会阻塞,直到给定进程 过期,因此您无需睡觉即可等待它。”
  • 我在主线程(父进程)中的睡眠只是表明该进程的一些繁忙工作,仅此而已。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 2021-10-17
相关资源
最近更新 更多