V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
smallgoogle
V2EX  ›  Python

apply_async 如何调用 class 而不是 func

  •  
  •   smallgoogle · 2020-05-22 16:42:07 +08:00 · 2188 次点击
    这是一个创建于 1650 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码:

    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

    4 条回复    2020-05-25 09:23:41 +08:00
    wuyifar
        1
    wuyifar  
       2020-05-22 17:13:38 +08:00
    直接在 worker 中 try 不行吗
    wellsc
        2
    wellsc  
       2020-05-22 17:16:13 +08:00
    再包装一个方法?
    gnozix
        3
    gnozix  
       2020-05-22 17:49:03 +08:00
    把 run 方法改成 __call__ 方法,然后修改成 `po.apply_async(tasktest(i), error_callback=throw_error)` 就可以了
    yyb123456789
        4
    yyb123456789  
       2020-05-25 09:23:41 +08:00
    你这是里面没有触发错误去执行回调,raise 一个错误就好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5477 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 130ms · UTC 01:24 · PVG 09:24 · LAX 17:24 · JFK 20:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.