代码:
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
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.