Python 如何停止多处理。池发生异常
在下面的代码中,我在第一次调用时引发了一个异常,但似乎异常被吸收了,我仍然执行了所有其他进程,这是什么问题?我想要的是,每当发生第一个异常时,打印它,并直接停止多处理池Python 如何停止多处理。池发生异常,python,python-3.x,multiprocessing,python-multiprocessing,Python,Python 3.x,Multiprocessing,Python Multiprocessing,在下面的代码中,我在第一次调用时引发了一个异常,但似乎异常被吸收了,我仍然执行了所有其他进程,这是什么问题?我想要的是,每当发生第一个异常时,打印它,并直接停止多处理池 def func(i): if i==0: raise Exception() else: time.sleep(1) print(i) num_workers = 4 pool = multiprocessing.Pool(num_workers) try
def func(i):
if i==0:
raise Exception()
else:
time.sleep(1)
print(i)
num_workers = 4
pool = multiprocessing.Pool(num_workers)
try:
for i in range(4):
pool.apply_async(func,args=(i,))
except:
print("err")
pool.close()
pool.join()
以下是根据HTF编辑的代码
import multiprocessing
import time
if __name__ == '__main__':
def func(i):
if i == 0:
raise Exception()
else:
time.sleep(1)
print(i)
num_workers = 4
pool = multiprocessing.Pool(num_workers)
results = [pool.apply_async(func, args=(i,)) for i in range(4)]
try:
for result in results:
result.get()
except:
print("err")
pool.close()
pool.join()
输出
err
1
2
3
我只希望
err
您刚刚安排了任务,但需要等待:
更新星期三4月7日20:42:59 UTC 2021:
$ python test1.py
ERROR: something bad happened
$ python test2.py
0
2
1
3
Result for: 0
Result for: 2
Result for: 1
Result for: 3
您可以尝试以下方法:
import time
from functools import partial
from multiprocessing import Pool
def func(i):
if i == 0:
raise Exception("something bad happened")
else:
time.sleep(1)
print(i)
def quit(pool, err):
print(f"ERROR: {err}")
pool.terminate()
def main():
pool = Pool()
partial_quit = partial(quit, pool)
for i in range(4):
pool.apply_async(func, args=(i,), error_callback=partial_quit)
pool.close()
pool.join()
if __name__ == "__main__":
main()
测试:
$ python test1.py
ERROR: something bad happened
$ python test2.py
0
2
1
3
Result for: 0
Result for: 2
Result for: 1
Result for: 3
如果需要返回值,那么使用裸进程和队列实际上可能更容易:
import time
from multiprocessing import Process, Queue
PROCS = 4
def worker(q, i):
if i == 10:
print("error")
q.put_nowait("ERROR")
else:
time.sleep(1)
print(i)
q.put_nowait(i)
def main():
q = Queue()
procs = []
for i in range(PROCS):
p = Process(target=worker, args=(q, i))
p.start()
procs.append(p)
count = len(procs)
while count:
result = q.get()
if result == "ERROR":
for p in procs:
p.terminate()
break
print(f"Result for: {result}")
count -= 1
if __name__ == "__main__":
main()
测试:
$ python test1.py
ERROR: something bad happened
$ python test2.py
0
2
1
3
Result for: 0
Result for: 2
Result for: 1
Result for: 3
谢谢,我应该在你的代码之后做一个
pool.close()
和pool.join()
,如果我添加它,为什么结果是err1 2 3
;如果没有,那么为什么我们不需要?是的,您应该这样做,除非您将其与上下文管理器一起使用:将Pool()用作Pool:…
那么为什么结果仍然打印1,2,3?您好,我编辑了我的问题,以包含完整的代码供您参考,它仍然给出了1,2,3@william007检查我的更新从这个看起来你想做这样的事情。