Maison > Questions et réponses > le corps du texte
Je souhaite encapsuler le pool de processus dans un décorateur, mais il ne prend pas effet et ne signale pas d'erreur
# coding:utf-8
import multiprocessing
import tornado
from tornado.httpclient import AsyncHTTPClient
process_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()
Les résultats sont les suivants
/usr/bin/python2.7 /home/xxx/workspace/py_project/crawler/center/sample.py
Process finished with exit code 0
Mais ce qui est étrange, c'est que je l'ai réécrit en mode multi-processus et j'ai découvert qu'il pouvait prendre effet
# coding:utf-8
import multiprocessing
import tornado
from tornado.httpclient import AsyncHTTPClient
process_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()
Le journal est le suivant
/usr/bin/python2.7 /home/shufeng/workspace/private_project/jobscrawler/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={})
La même situation se produira également lors de l'utilisation de pools de threads et de coroutines. Quelqu'un sait-il ce qui se passe ?
大家讲道理2017-06-28 09:26:20
Zhihu Spirit Sword Master a répondu à cette question : https://www.zhihu.com/questio...
巴扎黑2017-06-28 09:26:20
Lors de l'exécution sous Linux, vous obtiendrez l'erreur suivante :
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
Et cette erreur est signalée car, transmise 不可序列化
的对象进进程池时, 报错导致的, 而这个对象就是实例方法
, 可以试下用py3运行下, 因为3的实例方法
已经可以支持序列化
Référence : https://virusdefender.net/ind...