【问题标题】:Python multiprocessing pool not work in decoratePython多处理池在装饰中不起作用
【发布时间】:2017-06-26 02:52:23
【问题描述】:

我正在尝试编写一个基于多处理池的装饰,但是它不起作用,并且无法捕获异常,请显示我的代码:

def handle_request(response):
    print str(response)

def run_in_process(process_num):
    def _run_in_process(f):
        def __run_in_process(*args, **kwargs):
            pool = multiprocessing.Pool(processes=process_num)
            for i in range(process_num):
                pool.apply_async(f, args=args, kwds=kwargs, callback=kwargs.get("callback"))
            pool.close()
            pool.join()

        return __run_in_process

    return _run_in_process


@run_in_process(process_num)
def main():
    http_client = AsyncHTTPClient()
    http_client.fetch(url, callback=handle_request)
    global loop
    loop = tornado.ioloop.IOLoop.instance()
    if loop._running is False:
        loop.start()


if __name__ == '__main__':
    main()

显示我的日志:

/usr/bin/python2.7 /home/workspace/py_project/crawler/center/sample.py
Process finished with exit code 0

但是当我改变我的方式时,当我使用多处理时它运行良好,就像:

def handle_request(response):
    print str(response)

def run_in_process(process_num):
    def _run_in_process(f):
        def __run_in_process(*args, **kwargs):
            _processes = []
            for i in xrange(process_num):
                p = multiprocessing.Process(target=f, args=args, kwargs=kwargs)
                p.start()
                _processes.append(p)

            for p in _processes:
                p.join()

        return __run_in_process
    return _run_in_process


@run_in_process(process_num)
def main():
    http_client = AsyncHTTPClient()
    http_client.fetch(url, callback=handle_request)
    global loop
    loop = tornado.ioloop.IOLoop.instance()
    if loop._running is False:
        loop.start()


if __name__ == '__main__':
    main()

显示我的日志:

/usr/bin/python2.7 /home/workspace/py_project/crawler/center/sample.py
HTTPResponse(_body=None,buffer=<_io.BytesIO object at 0x7f2fdaa21ef0>,code=200,effective_url='http://www.baidu.com',error=None,headers=<tornado.httputil.HTTPHeaders object at 0x7f2fdaa425d0>,reason='OK',request=<tornado.httpclient.HTTPRequest object at 0x7f2fdaa42250>,request_time=0.014312028884887695,time_info={})
HTTPResponse(_body=None,buffer=<_io.BytesIO object at 0x7f2fdaa21ef0>,code=200,effective_url='http://www.baidu.com',error=None,headers=<tornado.httputil.HTTPHeaders object at 0x7f2fdaa43450>,reason='OK',request=<tornado.httpclient.HTTPRequest object at 0x7f2fdaa430d0>,request_time=0.02327895164489746,time_info={})
HTTPResponse(_body=None,buffer=<_io.BytesIO object at 0x7f2fdaa21ef0>,code=200,effective_url='http://www.baidu.com',error=None,headers=<tornado.httputil.HTTPHeaders object at 0x7f2fdaa43510>,reason='OK',request=<tornado.httpclient.HTTPRequest object at 0x7f2fdaa43190>,request_time=0.026951074600219727,time_info={})
HTTPResponse(_body=None,buffer=<_io.BytesIO object at 0x7f2fdaa21ef0>,code=200,effective_url='http://www.baidu.com',error=None,headers=<tornado.httputil.HTTPHeaders object at 0x7f2fdaa42690>,reason='OK',request=<tornado.httpclient.HTTPRequest object at 0x7f2fdaa42310>,request_time=0.0552978515625,time_info={})
HTTPResponse(_body=None,buffer=<_io.BytesIO object at 0x7f2fdaa24ef0>,code=200,effective_url='http://www.baidu.com',error=None,headers=<tornado.httputil.HTTPHeaders object at 0x7f2fdaa39e10>,reason='OK',request=<tornado.httpclient.HTTPRequest object at 0x7f2fdaa39a90>,request_time=0.05612993240356445,time_info={})

我不明白发生了什么,gevent 上也发生了同样的事情。有人知道请帮帮我。

【问题讨论】:

    标签: python multiprocessing decorator


    【解决方案1】:

    如果计划函数引发异常,Python 2.7 中的multiprocessing.Pool 不会运行回调。这已在 Python 3 中修复,添加了 error_callback

    我建议你修改内部循环如下以实际看到错误:

    results = []
    
    pool = multiprocessing.Pool(processes=process_num)
    for i in range(process_num):
        result = pool.apply_async(f, args=args, kwds=kwargs, callback=kwargs.get("callback"))
        results.append(result)
    
    for result in results:
        result.get()  # this will raise the exception in the worker
    
    pool.close()
    pool.join()
    

    【讨论】:

    • 好建议!出现异常堆栈。回溯(最后一次调用):文件“/home/xx/workspace/py_project/crawler/center/sample.py”,第 43 行,在 main() 文件“/home/xx/workspace/py_project/crawler /center/sample.py”,第 23 行,在 run_in_process result.get() 文件“/usr/lib/python2.7/multiprocessing/pool.py”,第 558 行,在 get raise self._value cPickle 中。 PicklingError: Can't pickle : attribute lookup __builtin.function failed
    • 请更新问题,添加格式正确的异常。您使用的是什么操作系统?是 Windows 吗?
    猜你喜欢
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 2016-03-14
    相关资源
    最近更新 更多