python - 在尚未启动的池工作人员中捕获异常
问题描述
我正在尝试在子进程中捕获异常。如果工人数量 == 任务数量,我的代码(见下文)可以正常工作。但是,如果工作人员比示例中的任务多,则尚未启动的 2 个进程将抛出相同的异常,但我在 MainProcess 和子进程中都无法捕获它。
from multiprocessing import Pool, current_process
import time
from exceptions import GracefulExit
import signal
def terminate_handler(signum, frame):
print(dir(frame))
if current_process().name == 'MainProcess':
# we will not raise error if process
# is main because we need to finish all the jobs
return
raise GracefulExit()
def test_func(val):
i = 0
try:
while True:
time.sleep(0.1)
i += 1
if i >= 10:
return i
except GracefulExit:
pass
return i
if __name__ == "__main__":
signal.signal(
signal.SIGINT, terminate_handler)
try:
with Pool(5) as p:
r = p.map(test_func, [1, 2, 3])
except GracefulExit:
pass
print(r)
解决方案
我能建议什么,选择任何变体:
确保任务数量不小于工人数量,只需添加存根(例如
None
)以确保所有工人都将启动run
Pool的Process的override方法:class CustomProcess(Process): def run(self): try: super().run() except GracefulExit: print('interrupted idle worker') class CustomPool(multiprocessing.pool.Pool): Process = CustomProcess .... with CustomPool(5) as p: r = p.map(test_func, [1, 2, 3])
编写自己的池实现
推荐阅读
- database - B+ 树是否有可能从其叶节点中删除一个数字,但不会从内部节点中删除?
- maven - 在Android库中本地添加jar vs maven依赖
- python - Python 绘制 X 轴值
- state - 修改 RNN 网络中状态的输出?
- laravel - 我无法在 laravel 平台的数据库中记录
- google-analytics - 警告:Provisioning API 目前只能通过邀请获得
- google-cloud-platform - 谷歌云平台Oracle DB/ODI/OBIEE安装
- python - 如何找到给定一维数组中的所有峰值?
- powershell - 从文件中读取行并使用参数运行外部程序(PowerShell)
- google-apps-script - 如何将 appscript(Google Docs)中的表格附加到所有其他表格之上