并發(fā)模型 - python將進(jìn)程池放在裝飾器里為什么不生效也沒報(bào)錯(cuò)
問題描述
我想把進(jìn)程池封裝在裝飾器里,但是它既沒生效也沒報(bào)錯(cuò)
# coding:utf-8import multiprocessingimport tornadofrom tornado.httpclient import AsyncHTTPClientprocess_num = 20 # 進(jìn)程數(shù)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()
結(jié)果如下
/usr/bin/python2.7 /home/xxx/workspace/py_project/crawler/center/sample.pyProcess finished with exit code 0
但是奇怪的是,我用多進(jìn)程的方式重寫一次,發(fā)現(xiàn)是可以生效的
# coding:utf-8import multiprocessingimport tornadofrom tornado.httpclient import AsyncHTTPClientprocess_num = 20 # 進(jìn)程數(shù)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={})
同樣的情況也會出現(xiàn)在線程池跟協(xié)程的使用上,有誰知道這是怎么回事嗎?
問題解答
回答1:知乎靈劍大神已回答此問題:https://www.zhihu.com/questio...
回答2:在linux下運(yùn)行, 會得到下面的報(bào)錯(cuò):
PicklingError: Can’t pickle <type ’function’>: attribute lookup __builtin__.function failed
而這個(gè)報(bào)錯(cuò)是因?yàn)? 傳入不可序列化的對象進(jìn)進(jìn)程池時(shí), 報(bào)錯(cuò)導(dǎo)致的, 而這個(gè)對象就是實(shí)例方法, 可以試下用py3運(yùn)行下, 因?yàn)?的實(shí)例方法已經(jīng)可以支持序列化
參考資料: https://virusdefender.net/ind...
相關(guān)文章:
1. mysql儲存json錯(cuò)誤2. 輸入地址報(bào)以下截圖錯(cuò)誤,怎么辦?3. 請問朱老師,如何配置url訪問路由4. node.js - nodejs開發(fā)中常用的連接mysql的庫5. 為啥獲取不到呀?6. php怎么用isMobile()函數(shù)識別pc端移動(dòng)端自動(dòng)跳轉(zhuǎn)7. mysql - 這種分級一對多,且分級不平衡的模型該怎么設(shè)計(jì)表?8. mysql - .sql格式的表結(jié)構(gòu)文件用navicat怎么導(dǎo)入?9. mysql分庫分表量級疑問10. php - TP5的登錄驗(yàn)證問題
