使用 requests 时,发现一个问题。
一个基本的请求。
requests.get('http://www.xxx.com', headers=headers)
当用多线程时: 效率会明显提高,但是如果这个 url 是打不开的,那多线程会变得与单线程一样,会卡在那个不能打开的 url 上一直等待到报错。 timeout 参数只对可以打开的 url 有效果。
多线程:
def getHtml(url):
try:
requests.get(url)
print(url)
except:
print("wrong: {0}".format(url))
0 (仅测试。)
import threading
for url in urls:
worker = threading.Thread(target=getHtml, args=(url,))
worker.start()
问题依旧。
1 使用封装的线程池。
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=10) as t:
for url in urls:
t.submit(getHtml, url)
查到用 map 方法可以设置 timeout ,不过设置后发现没用。。
with ThreadPoolExecutor(max_workers=10) as t:
t.map(getHtml, urls, timeout=1)
2 使用 multiprocessing.dummy 的线程池。
发现一篇用这个库的文章。 https://segmentfault.com/a/1190000000382873
from multiprocessing.dummy import Pool as ThraedPool
pool = ThreadPool(10)
pool.map(getHtml, urls)
pool.close()
pool.join()
还是一样。遇到打不开的网址都会等待。
测试数据:
urls = [
'http://huahao917.com',
'http://huanreshebei.net',
'http://hyjsbj.com',
'http://hzjfwj.com',
'http://kitairu.net',
'http://jy-qj.com.cn',
'http://luosi580.com',
'http://lyljbj.com',
'http://psxti.com',
'http://pt-ti.cn']
其中 http://jy-qj.com.cn 与 http://hzjfwj.com 是无法访问的。
urllib.urlrequest.urlopen 与 requests 一样会等待,有什么办法可以不在那个无法访问的网址上等待?
还是我的多线程姿势用错了?望指教。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.