我正在使用多处理模块的Process类来生成多个进程,这些进程执行一些脚本然后就死了。我想要什么,在每个进程上应用超时,这样一个进程就会因为无法及时执行而死>超时即可。我在Process对象上使用join(timeout)
。
Since the join() function doesn;t kill the process, it just blocks the process until it finishes
现在我的问题:使用join()
与timeout
..有什么副作用,在主进程死后,是否会自动清理进程?或者我必须手动杀死这些进程??
我是python及其多处理模块的新手,请耐心等待。
我的代码,它在for循环中创建进程::
q = Queue()
jobs = [
Process(
target=get_current_value,
args=(q,),
kwargs=
{
'device': device,
'service_list': service_list,
'data_source_list': data_source_list
}
) for device in device_list
]
for j in jobs:
j.start()
for k in jobs:
k.join()
答案 0 :(得分:1)
timeout
参数只是告诉join
在放弃之前等待Process
退出的时间。如果timeout
过期,则Process
不会退出; join
来电只是取消阻止。如果要在超时到期时结束工作,则需要手动执行此操作。你可以按照wRAR的建议使用terminate
来不当地关闭东西,或者使用其他一些信令机制告诉孩子们干净地关闭:
p = Process(target=worker, args=(queue,))
p.start()
p.join(50)
if p.isalive(): # join timed out without the process actually finishing
#p.terminate() # unclean shutdown
如果您不想使用terminate
,替代方法实际上取决于工作人员的行为。如果他们从队列中消费,您可以使用哨兵:
def worker(queue):
for item in iter(queue.get, None): # None will break the loop
# Do normal work
if __name__ == "__main__":
queue = multiprocessing.Queue()
p = multiprocessing.Process(target=worker, args=(queue,))
p.start()
# Do normal work here
# Time to shut down
queue.put(None)
如果您正在循环中执行其他操作,则可以使用Event
:
def worker(event):
while not event.is_set():
# Do work here
if __name__ == "__main__":
event= multiprocessing.Event()
p = multiprocessing.Process(target=worker, args=(event,))
p.start()
# Do normal work here
# Time to shut down
event.set()
但是,使用terminate
可能没问题,除非您的子进程正在使用可能在进程意外关闭时损坏的资源(例如写入文件或数据库或持有锁)。如果您只是在工作人员中进行一些计算,使用terminate
不会伤害任何事情。
答案 1 :(得分:0)
join()
对子进程没有任何作用。如果您真的想以非干净的方式终止工作进程,则应使用terminate()
(您应该了解后果)。
如果您希望在主进程退出时终止子进程,则应在其上设置daemon
属性。