python multiprocessing多进程中开辟多线程的问题
叙述起来有些麻烦,大致说一下:主程序中我开辟了进程池,然后我在其中一个进程中开辟个线程池,利用该线程池并发请求页面!但是,我发现线程池的分配必须写到函数中,如果写到外边当作全局变量的话,程序就一直卡在那里,不知道是阻塞了?还是无限的“递归”下去了?总之不出结果。
虽然我知道,线程池不能在主程序中分配好然后作为参数传给某个进程中使用,毕竟是进程嘛。一个道理,import的时候其实全局变量的线程池已经分配好了,然后你在进程中调用应该跟刚才说的是一个道理。我不明白的是为什么会一直运行....为什么不是报错?
代码贴在下边:
segmentfault不支持上传文件么??只能大家copy代码执行了。
主程序:开辟进程池,其中某个进程调用另一个文件的抓取方法,将url列表作为参数:
import json
import urllib_fetcher as ulib_fetch
#from multiprocessing.dummy import Pool as ThreadPool
from multiprocessing import Pool as ProcessPool
g_url_list = [
'http://segmentfault.com/q/1010000000742958',
'http://segmentfault.com/q/1010000003793646',
'http://segmentfault.com/q/1010000003757654',
'http://tieba.baidu.com/f?kw=%C4%E1%C2%EA&fr=ala0&tpl=5',
]
def main():
process_pool = ProcessPool(3)
ret = process_pool.apply_async(ulib_fetch.fetch, (g_url_list,))
process_pool.close()
process_pool.join()
print json.dumps(ret.get(), False, False)
if __name__ == "__main__":
main()
另一个抓取方法文件:urllib_fetcher.py
import sys
import urllib2 as ulib
from multiprocessing.dummy import Pool as ThreadPool
import socket
###########global var############
socket.setdefaulttimeout(5) # 设置全局的超时时间
thread_pool = ThreadPool(5) # ****全局线程池放到这里不行***
###########global var############
def unify_request(url):
"""
统一请求,失败的请求线程将返回None
"""
try:
res = ulib.urlopen(url)
except:
sys.stderr.write("urllib_fetcher failed for url: %s\n" % url)
return None
result = {
"url" : res.url,
"code" : res.code,
}
return result
def fetch(urls):
# thread_pool = ThreadPool(5) # 放到这里ok
try:
results = thread_pool.map(unify_request, urls)
except:
sys.stderr.write("fetch failed!\n")
return []
thread_pool.close()
thread_pool.join()
return results
装死型老雷
9 years, 5 months ago