我正在尝试使用Python和多处理和请求libs下载几千个图像。一开始一切都很好,但是大约有100张图片,所有的东西都被锁上了,我不得不终止进程。我使用的是python2.7.6。代码如下:
import requests
import shutil
from multiprocessing import Pool
from urlparse import urlparse
def get_domain_name(s):
domain_name = urlparse(s).netloc
new_s = re.sub('\:', '_', domain_name) #replace colons
return new_s
def grab_image(url):
response = requests.get(url, stream=True, timeout=2)
if response.status_code == 200:
img_name = get_domain_name(url)
with open(IMG_DST + img_name + ".jpg", 'wb') as outf:
shutil.copyfileobj(response.raw, outf)
del response
def main():
with open(list_of_image_urls, 'r') as f:
urls = f.read().splitlines()
urls.sort()
pool = Pool(processes=4, maxtasksperchild=2)
pool.map(grab_image, urls)
pool.close()
pool.join()
if __name__ == "__main__":
main()
编辑:将多处理导入更改为多处理.dummy使用线程而不是进程,我仍然遇到同样的问题。似乎我有时会碰到一个运动jpeg流,而不是一个单一的图像,这导致了相关的问题。为了解决这个问题,我使用了一个上下文管理器,并创建了一个FileTooBigException。虽然我还没有执行检查以确保我确实下载了图像文件和其他一些打扫房间的工作,但我认为下面的代码可能对某些人有用:
^{pr2}$而且,欢迎任何改进建议!在
使用
multiprocessing
进行I/O并发是没有意义的。在网络I/O中,所涉及的线程大部分时间都在等待,什么也不做。Python线程非常适合于无所事事。所以使用线程池,而不是processpool。每一个进程都会消耗大量的资源,对于I/O绑定的活动来说是不必要的。而线程共享进程状态,正是您要查找的。在相关问题 更多 >
编程相关推荐