【发布时间】:2022-01-18 05:41:15
【问题描述】:
我正在尝试对可能返回段错误的函数使用多处理(我无法控制此 ATM)。在子进程遇到段错误的情况下,我只希望该子进程失败,但所有其他子任务继续/返回其结果。
我已经从 multiprocessing.Pool 切换到 concurrent.futures.ProcessPoolExecutor 避免了子进程永远挂起(或直到任意超时)的问题,如此错误中所述:https://bugs.python.org/issue22393。
但是我现在面临的问题是,当第一个子任务遇到段错误时,所有运行中的子进程都被标记为损坏 (concurrent.futures.process.BrokenProcessPool)。
有没有办法只将实际损坏的子进程标记为损坏?
我在Python 3.7.4中运行的代码:
import concurrent.futures
import ctypes
from time import sleep
def do_something(x):
print(f"{x}; in do_something")
sleep(x*3)
if x == 2:
# raise a segmentation fault internally
return x, ctypes.string_at(0)
return x, x-1
nums = [1, 2, 3, 1.5]
executor = concurrent.futures.ProcessPoolExecutor()
result_futures = []
for num in nums:
# Using submit with a list instead of map lets you get past the first exception
# Example: https://stackoverflow.com/a/53346191/7619676
future = executor.submit(do_something, num)
result_futures.append(future)
# Wait for all results
concurrent.futures.wait(result_futures)
# After a segfault is hit for any child process (i.e. is "terminated abruptly"), the process pool becomes unusable
# and all running/pending child processes' results are set to broken
for future in result_futures:
try:
print(future.result())
except concurrent.futures.process.BrokenProcessPool:
print("broken")
结果:
(1, 0)
broken
broken
(1.5, 0.5)
想要的结果:
(1, 0)
broken
(3, 2)
(1.5, 0.5)
【问题讨论】:
标签: python python-3.x multiprocessing python-multiprocessing concurrent.futures