满足条件时终止多处理进程
Killing a multiprocessing process when condition is met
我试图 运行 的想法是:
运行 3 个进程进行计算
ONCE 3个进程之一完成任务
立即杀掉其他人继续主线任务,我不能让它运行再拖延
我尝试过的是:
通过 multiprocessing.manager 放置全局变量,但这仍然可以让进程完成循环。
引发异常
OS: Windows
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()
当我将做的事情标记为假时,我希望能够终止所有进程,引发异常或以任何方式在其中一个进程上完成计算
编辑:不是重复的,因为它仍然完成执行代码,例如请求模块仍然发送数据
如果您需要即时终止,您可以使用 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
我试图 运行 的想法是:
运行 3 个进程进行计算 ONCE 3个进程之一完成任务 立即杀掉其他人继续主线任务,我不能让它运行再拖延
我尝试过的是: 通过 multiprocessing.manager 放置全局变量,但这仍然可以让进程完成循环。 引发异常
OS: Windows 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()
当我将做的事情标记为假时,我希望能够终止所有进程,引发异常或以任何方式在其中一个进程上完成计算
编辑:不是重复的,因为它仍然完成执行代码,例如请求模块仍然发送数据
如果您需要即时终止,您可以使用 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