gpt4 book ai didi

python - 满足条件时终止多处理进程

转载 作者:太空宇宙 更新时间:2023-11-04 04:22:27 25 4
gpt4 key购买 nike

我试图运行的想法是这样的:

RUN 3 进行计算的进程ONCE 3个进程之一完成任务立即杀了其他人继续主线任务,我不能让它再跑一秒

我尝试过的是: 通过 multiprocessing.manager 放置全局变量,但这仍然让进程完成它们的循环。 引发异常

操作系统: window python :2.7

def f(name):
Doing = True
try:
while Doing:
print 'DOING',name
somecodethatmarksDoingAsFalse()
except Exception as error:
print 'bye'
print error
Doing = False
return True




if __name__ == '__main__':
p = multiprocessing.Process(target=f, args=('bob',))
p2 = multiprocessing.Process(target=f, args=('tom',))
p.start()
p2.start()

p.join()
p2.join()


raise Exception('I know Python!')
sys.exit()

我希望能够在我将 doing 标记为 false 时终止所有进程,引发异常或在其中一个进程上完成计算时以任何方式结束

编辑:它不是重复的,因为它仍然完成执行代码,例如请求模块仍然发送数据

最佳答案

如果您需要即时终止,您可以使用 multiprocessing.Event 通知父进程满足的条件,并让它立即终止工作进程。管理器进程对于这种需要的小同步来说太重量级了。

import os
from datetime import datetime
from multiprocessing import Process, Event


def worker(range_, target, found_event):
print('{} | pid: {} started'.format(datetime.now(), os.getpid()))
for x in range_:
if x == target:
print('{} | pid: {} found target'.format(
datetime.now(), os.getpid())
)
found_event.set()


if __name__ == "__main__":

N_WORKERS = 4

step = int(200e6)
ranges = [range(x, x + step) # change `range` to `xrange` for Python 2
for x in range(0, N_WORKERS * step, step)]
# range(0, 200000000), ..., range(800000000, 1000000000)]
target = int(150e6) # <-- worker finding this value triggers massacre
found_event = Event()

pool = [Process(target=worker, args=(range_, target, found_event))
for range_ in ranges]

for p in pool:
p.start()

found_event.wait() # <- blocks until condition met
print('{} | terminating processes'.format(datetime.now()))
for p in pool:
p.terminate()
for p in pool:
p.join()
print('{} | all processes joined'.format(datetime.now()))

示例输出:

2019-01-17 01:55:33.781884 | pid: 28376 started
2019-01-17 01:55:33.782333 | pid: 28377 started
2019-01-17 01:55:33.782851 | pid: 28378 started
2019-01-17 01:55:33.783484 | pid: 28379 started
2019-01-17 01:55:54.715425 | pid: 28376 found target
2019-01-17 01:55:54.715613 | terminating processes
2019-01-17 01:55:54.716326 | all processes joined

Process finished with exit code 0

关于python - 满足条件时终止多处理进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54224989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com