|
我想把进程池封装在装饰器里,但是它既没生效也没报错
- 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()
复制代码
结果如下:
- /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={})
复制代码 同样的情况也会出现在线程池跟协程的使用上,有谁知道这是怎么回事吗?
|
|