Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何停止多处理。池发生异常_Python_Python 3.x_Multiprocessing_Python Multiprocessing - Fatal编程技术网

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检查我的更新从这个看起来你想做这样的事情。