为什么python不报错不出结果_python将进程池放在装饰器里为什么不生效也没报错...

我想把进程池封装在装饰器里,但是它既没生效也没报错

# 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()

结果如下

/usr/bin/python2.7 /home/xxx/workspace/py_project/crawler/center/sample.py

Process finished with exit code 0

但是奇怪的是,我用多进程的方式重写一次,发现是可以生效的

# 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()

日志如下

/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=,reason='OK',request=,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=,reason='OK',request=,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=,reason='OK',request=,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=,reason='OK',request=,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=,reason='OK',request=,request_time=0.05612993240356445,time_info={})

同样的情况也会出现在线程池跟协程的使用上,有谁知道这是怎么回事吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值