Python 在 IO 上发布 GIL。如果大部分时间都花在做休息请求上;您可以使用线程来加快处理速度:
try:
from gevent.pool import Pool # $ pip install gevent
import gevent.monkey; gevent.monkey.patch_all() # patch stdlib
except ImportError: # fallback on using threads
from multiprocessing.dummy import Pool
import urllib2
def process_line(url):
try:
return urllib2.urlopen(url).read(), None
except EnvironmentError as e:
return None, e
with open('input.csv', 'rb') as file, open('output.txt', 'wb') as outfile:
pool = Pool(20) # use 20 concurrent connections
for result, error in pool.imap_unordered(process_line, file):
if error is None:
outfile.write(result)
如果输入/输出顺序应该相同;你可以使用imap
而不是imap_unordered
.
如果您的程序受 CPU 限制;您可以使用multiprocessing.Pool()
它来创建多个进程。
另请参阅Python 解释器阻止多线程 DNS 请求?
这个答案显示了如何使用 threading + Queue modules 手动创建线程池。