apply_async 如何调用 class 而不是 func

2020-05-22 16:42:07 +08:00
 smallgoogle

代码:

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

2025 次点击
所在节点    Python
4 条回复
wuyifar
2020-05-22 17:13:38 +08:00
直接在 worker 中 try 不行吗
wellsc
2020-05-22 17:16:13 +08:00
再包装一个方法?
gnozix
2020-05-22 17:49:03 +08:00
把 run 方法改成 __call__ 方法,然后修改成 `po.apply_async(tasktest(i), error_callback=throw_error)` 就可以了
yyb123456789
2020-05-25 09:23:41 +08:00
你这是里面没有触发错误去执行回调,raise 一个错误就好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/674435

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX