代码:
from multiprocessing import Pool
import os, time
class tasktest():
def __init__(self, msg):
self.msg = msg
def run(self):
# printxx()
print("=== 主进程号%d, 进程号为%d" % (os.getppid(), os.getpid()))
# print(self.msg)
def throw_error(e):
print('=========== Error Start ===========')
print("主进程号%d, 进程号为%d" % (os.getppid(), os.getpid()))
print('=========== Error End ===========')
def worker(msg):
t_start = time.time()
print("开始执行,主进程号%d,进程号为%d" % (os.getppid(), os.getpid()))
tasktest(msg).run()
t_stop = time.time()
print("执行完毕,耗时%0.2f" % (t_stop - t_start))
def start(d):
po = Pool(10)
d_list = d
for_times = 0
while len(d_list) > 0:
x = 0
for i in list(d_list):
if x < 2:
po.apply_async(worker, (i, ), error_callback=throw_error)
d_list.pop(0)
x+=1
else:
break
for_times += 1
po.close()
po.join()
if __name__ == '__main__':
d = [{
"id": 1,
}, {
"id": 2,
}, {
"id": 3,
}, {
"id": 4,
}]
start(d)
我当前是的 apply_async 是调用 worker 方法 然后 worker 再调用 tasktest
这样的话,我就不能在 error_callback 异常里处理 tasktest 的异常进程了。
那么如何 apply_async 可以直接调用 tasktest 呢? 比如:
po.apply_async(tasktest.run(), (i, ), error_callback=throw_error)
这样我就可以处理异常子进程了。
可是这个写法是不正确的,所以这个位置应该如何写呢?
我尝试过谷歌和百度,给出的方法都是 func,并没有说如何 class 这样调用。
自己截帖一下:
po.apply_async(Baidu(i).run, error_callback=throw_error)
原来酱紫即可, 可是问题来了, 这样还是没办法在 throw_error 获取到子进程的 pid
1
wuyifar 2020-05-22 17:13:38 +08:00
直接在 worker 中 try 不行吗
|
2
wellsc 2020-05-22 17:16:13 +08:00
再包装一个方法?
|
3
gnozix 2020-05-22 17:49:03 +08:00
把 run 方法改成 __call__ 方法,然后修改成 `po.apply_async(tasktest(i), error_callback=throw_error)` 就可以了
|
4
yyb123456789 2020-05-25 09:23:41 +08:00
你这是里面没有触发错误去执行回调,raise 一个错误就好
|