并发模型 - python将进程池放在装饰器里为什么不生效也没报错
问题描述
我想把进程池封装在装饰器里,但是它既没生效也没报错
# coding:utf-8import multiprocessingimport tornadofrom tornado.httpclient import AsyncHTTPClientprocess_num = 20 # 进程数url = 'https://www.baidu.com'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/xxx/workspace/py_project/crawler/center/sample.pyProcess finished with exit code 0
但是奇怪的是,我用多进程的方式重写一次,发现是可以生效的
# coding:utf-8import multiprocessingimport tornadofrom tornado.httpclient import AsyncHTTPClientprocess_num = 20 # 进程数url = 'https://www.baidu.com'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/shufeng/workspace/private_project/jobscrawler/center/sample.pyHTTPResponse(_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={})
同样的情况也会出现在线程池跟协程的使用上,有谁知道这是怎么回事吗?
问题解答
回答1:知乎灵剑大神已回答此问题:https://www.zhihu.com/questio...
回答2:在linux下运行, 会得到下面的报错:
PicklingError: Can’t pickle <type ’function’>: attribute lookup __builtin__.function failed
而这个报错是因为, 传入不可序列化的对象进进程池时, 报错导致的, 而这个对象就是实例方法, 可以试下用py3运行下, 因为3的实例方法已经可以支持序列化
参考资料: https://virusdefender.net/ind...
相关文章:
1. css3 - 微信前端页面遇到的transition过渡动画的bug2. css - 文字排版问题,内容都是动态抓出来的,字数不一定。如何对齐啊3. 网页爬虫 - 关于Python的编码与解码问题4. css3 - 微信小程序如何把radio改成2个选择按钮的样式5. javascript - 为什么var obj = {}创建对象的方法里面不能用this.xxx来声明属性 ?6. javascript - router.push无效7. javascript - 浏览器回退,如何保证js对dom的操作保存下来8. selenium-selenium-webdriver - python 将当前目录加入到 环境变量9. css - input间的间距和文字上下居中10. 为什么javascript 18014398501093363 == 18014398501093364 返回ture

网公网安备