提前退出multiprocessing.Pool.map(在子进程中进行提升不起作用)

安德里亚·雷纳(Andrea Reina)

Rugnar的回答所述,我的繁殖是错误我大部分时间都保持原样,因为我不确定这在澄清和更改含义之间

我有成千上万的工作需要运行,并且希望有任何错误立即停止执行。我将任务包装在try/ except…中,raise以便可以记录错误(没有所有的多处理/线程噪音),然后重新引发。这并没有杀死的主要过程。

发生了什么事,如何才能找到想要的提早退房?sys.exit(1)在子死锁中,将try/ exceptraise函数包装在另一个函数中也不起作用。

$ python3 mp_reraise.py
(0,)
(1,)
(2,)
(3,)
(4,)
(5,)
(6,)
(7,)
(8,)
(9,)
multiprocessing.pool.RemoteTraceback:
"""
Traceback (most recent call last):
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 119, in worker
    result = (True, func(*args, **kwds))
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 44, in mapstar
    return list(map(*args))
  File "mp_reraise.py", line 5, in f_reraise
    raise Exception(args)
Exception: (0,)
"""

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "mp_reraise.py", line 14, in <module>
    test_reraise()
  File "mp_reraise.py", line 12, in test_reraise
    p.map(f_reraise, range(10))
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 266, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 644, in get
    raise self._value
Exception: (0,)

mp_reraise.py

import multiprocessing

def f_reraise(*args):
    try:
        raise Exception(args)
    except Exception as e:
        print(e)
        raise

def test_reraise():
    with multiprocessing.Pool() as p:
        p.map(f_reraise, range(10))

test_reraise()

如果我不追赶和加注,则执行会按预期提前终止:[根据Rugnar的回答,这实际上并没有停止]

$ python3 mp_raise.py 
multiprocessing.pool.RemoteTraceback: 
"""
Traceback (most recent call last):
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 119, in worker
    result = (True, func(*args, **kwds))
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 44, in mapstar
    return list(map(*args))
  File "mp_raise.py", line 4, in f_raise
    raise Exception(args)
Exception: (0,)
"""

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "mp_raise.py", line 10, in <module>
    test_raise()
  File "mp_raise.py", line 8, in test_raise
    p.map(f_raise, range(10))
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 266, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 644, in get
    raise self._value
Exception: (0,)  

mp_raise.py

import multiprocessing

def f_raise(*args):
    # missing print, which would demonstrate that
    # this actually does not stop early
    raise Exception(args)

def test_raise():
    with multiprocessing.Pool() as p:
        p.map(f_raise, range(10))

test_raise()
鲁格纳尔

在您中,mp_raise.py您什么都不打印,所以您看不到完成了多少工作。我添加了打印内容,发现只有在工作迭代器用尽时,池才能看到该子项的一部分。因此,它永远不会停止。

如果您需要在异常发生后提前停止,请尝试此操作

import time
import multiprocessing as mp


def f_reraise(i):
    if abort.is_set():  # cancel job if abort happened
        return
    time.sleep(i / 1000)  # add sleep so jobs are not instant, like in real life
    if abort.is_set():  # probably we need stop job in the middle of execution if abort happened
        return
    print(i)
    try:
        raise Exception(i)
    except Exception as e:
        abort.set()
        print('error:', e)
        raise


def init(a):
    global abort
    abort = a


def test_reraise():
    _abort = mp.Event()

    # jobs should stop being fed to the pool when abort happened
    # so we wrap jobs iterator this way
    def pool_args():
        for i in range(100):
            if not _abort.is_set():
                yield i

    # initializer and init is a way to share event between processes
    # thanks to https://stackoverflow.com/questions/25557686/python-sharing-a-lock-between-processes
    with mp.Pool(8, initializer=init, initargs=(_abort,)) as p:
        p.map(f_reraise, pool_args())


if __name__ == '__main__':
    test_reraise()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

检索使用multiprocessing.Pool.map启动的进程的退出代码

来自分类Dev

检索使用multiprocessing.Pool.map启动的进程的退出代码

来自分类Dev

为什么multiprocessing.pool的这种实现不起作用?

来自分类Dev

如何区分Multiprocessing.Pool中的进程?

来自分类Dev

如果创建multiprocessing.Pool,则Python子进程wait()失败

来自分类Dev

python multiprocessing pool.map挂起

来自分类Dev

multiprocessing.Pool.map抛出MemoryError

来自分类Dev

Python multiprocessing.Pool.map悄然死亡

来自分类Dev

python multiprocessing pool.map挂起

来自分类Dev

进程因 SIGSEGV 信号提前退出

来自分类Dev

将列表传递给multiprocessing.Pool似乎不起作用

来自分类Dev

如何在multiprocessing.pool中命名进程?

来自分类Dev

如何使用multiprocessing和pool.map跟踪状态?

来自分类Dev

Python Multiprocessing Pool.map导致__new__错误

来自分类Dev

如何使用带有多个参数的multiprocessing pool.map?

来自分类Dev

Python:非响应multiprocessing.pool.map_async()函数

来自分类Dev

multiprocessing.Pool.map()无法按预期工作

来自分类Dev

unrar在for语句中不起作用,以及如何提前退出For语句

来自分类Dev

列表长于进程数时的Python multiprocessing.Pool.map行为

来自分类Dev

python multiprocessing.pool.map,将参数传递给生成的进程

来自分类Dev

使用multiprocessing pool.map进行分布式计算的python

来自分类Dev

multiprocessing.Pool()的意外性能

来自分类Dev

parallel.futures.ProcessPoolExecutor与multiprocessing.pool.Pool

来自分类Dev

通过异步功能监视multiprocessing.pool.Pool对象

来自分类Dev

在长时间运行的任务中杀死QThread和multiprocessing.pool进程

来自分类Dev

python,multiprocessing和dmtcp:在Pool中检查一个进程?

来自分类Dev

利用“写时复制”功能将数据复制到Multiprocessing.Pool()工作进程

来自分类Dev

提前/滚动:不起作用

来自分类Dev

如何在循环中使用python multiprocessing Pool.map

Related 相关文章

  1. 1

    检索使用multiprocessing.Pool.map启动的进程的退出代码

  2. 2

    检索使用multiprocessing.Pool.map启动的进程的退出代码

  3. 3

    为什么multiprocessing.pool的这种实现不起作用?

  4. 4

    如何区分Multiprocessing.Pool中的进程?

  5. 5

    如果创建multiprocessing.Pool,则Python子进程wait()失败

  6. 6

    python multiprocessing pool.map挂起

  7. 7

    multiprocessing.Pool.map抛出MemoryError

  8. 8

    Python multiprocessing.Pool.map悄然死亡

  9. 9

    python multiprocessing pool.map挂起

  10. 10

    进程因 SIGSEGV 信号提前退出

  11. 11

    将列表传递给multiprocessing.Pool似乎不起作用

  12. 12

    如何在multiprocessing.pool中命名进程?

  13. 13

    如何使用multiprocessing和pool.map跟踪状态?

  14. 14

    Python Multiprocessing Pool.map导致__new__错误

  15. 15

    如何使用带有多个参数的multiprocessing pool.map?

  16. 16

    Python:非响应multiprocessing.pool.map_async()函数

  17. 17

    multiprocessing.Pool.map()无法按预期工作

  18. 18

    unrar在for语句中不起作用,以及如何提前退出For语句

  19. 19

    列表长于进程数时的Python multiprocessing.Pool.map行为

  20. 20

    python multiprocessing.pool.map,将参数传递给生成的进程

  21. 21

    使用multiprocessing pool.map进行分布式计算的python

  22. 22

    multiprocessing.Pool()的意外性能

  23. 23

    parallel.futures.ProcessPoolExecutor与multiprocessing.pool.Pool

  24. 24

    通过异步功能监视multiprocessing.pool.Pool对象

  25. 25

    在长时间运行的任务中杀死QThread和multiprocessing.pool进程

  26. 26

    python,multiprocessing和dmtcp:在Pool中检查一个进程?

  27. 27

    利用“写时复制”功能将数据复制到Multiprocessing.Pool()工作进程

  28. 28

    提前/滚动:不起作用

  29. 29

    如何在循环中使用python multiprocessing Pool.map

热门标签

归档