推荐学习书目
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 · May 22, 2020 · 3007 views
    This topic created in 2192 days ago, the information mentioned may be changed or developed.

    代码:

    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 replies    2020-05-25 09:23:41 +08:00
    wuyifar
        1
    wuyifar  
       May 22, 2020
    直接在 worker 中 try 不行吗
    wellsc
        2
    wellsc  
       May 22, 2020
    再包装一个方法?
    gnozix
        3
    gnozix  
       May 22, 2020
    把 run 方法改成 __call__ 方法,然后修改成 `po.apply_async(tasktest(i), error_callback=throw_error)` 就可以了
    yyb123456789
        4
    yyb123456789  
       May 25, 2020
    你这是里面没有触发错误去执行回调,raise 一个错误就好
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1319 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 17:31 · PVG 01:31 · LAX 10:31 · JFK 13:31
    ♥ Do have faith in what you're doing.