python中的多进程问题
# -*- coding: utf-8 -*- import sys import requests from bs4 import BeautifulSoup import json import multiprocessing reload(sys) sys.setdefaultencoding("utf-8") pre_url = r"http://110.110.110.110/adultvideo.science/media/videos/iphone/%d.mp4" image_path = r"d:/pythonWorkSpace/myfile/%s" # http://cdn.oss.gaokaopai.com//rq/134721.jpg headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Encoding": "gzip, deflate, sdch", "Accept-Language": "zh-CN,zh;q=0.8", "Cache-Control": "max-age=0", #"Host": "www.qiushibaike.com", "Proxy-Connection": "keep-alive", "Referer": "http://www.qiushibaike.com/", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/40.0.2214.111 Chrome/40.0.2214.111 Safari/537.36" } def down_all_image(data,pid): while True: try: i = data.get_nowait() print(u"%d正在现在第%d张图片" % (pid,i)) image_url = pre_url % i r = requests.get(image_url, headers=headers,stream=True,timeout=10) if r.status_code != 200 : continue if r.text.find("404 Not Found") > 0: continue file_name = image_url.split("/")[-1] save_file(image_path % file_name, r) except Exception,e: print(e) break print(u"第%d进程已终止"%pid) def start_thread(): data_queue = multiprocessing.Queue() for x in xrange(168, 201): data_queue.put(x) for x in range(2): r = multiprocessing.Process(target = down_all_image,args=(data_queue,x)) r.start() r.join() def save_file(file, response): with open(file, "wb") as imgfile: for chunk in response.iter_content(chunk_size=102400): if chunk : imgfile.write(chunk) def main(): start_thread() if __name__ == '__main__': main()
python写了一段下载程序,之前用来下载图片,没感觉出来问题,现在用来下载mp4,突然发现程序很奇怪:一个进程下载超时,另一进程也没有继续从queue获取id,继续访问,2个进程都卡住了,麻烦帮忙看看问题在哪?谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
引用来自“qycms_cn”的评论
用线程池来实现。
用线程池来实现。
引用来自“twisted3”的评论
打印的log显示进程都终止:
1. 在i=data.get_nowait()那里单独添加一个异常处理判断data是否有数据
2. 把try .. except.. 语句中的break去掉
引用来自“twisted3”的评论
打印的log显示进程都终止:
1. 在i=data.get_nowait()那里单独添加一个异常处理判断data是否有数据
2. 把try .. except.. 语句中的break去掉
引用来自“twisted3”的评论
打印的log显示进程都终止:
1. 在i=data.get_nowait()那里单独添加一个异常处理判断data是否有数据
2. 把try .. except.. 语句中的break去掉
打印的log显示进程都终止:
1. 在i=data.get_nowait()那里单独添加一个异常处理判断data是否有数据
2. 把try .. except.. 语句中的break去掉
引用来自“寂寞的原子”的评论
r.start()后面就 r.join()了,根本就没有多进程,而是一个进程执行完了再启动下一个。
应该把r存到一个数组里,全部start之后再join。
r.start()后面就 r.join()了,根本就没有多进程,而是一个进程执行完了再启动下一个。
应该把r存到一个数组里,全部start之后再join。