python中的多进程问题

发布于 2021-12-01 07:51:17 字数 2295 浏览 792 评论 8

# -*- 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

策马西风 2021-12-04 00:24:53

引用来自“qycms_cn”的评论

multiprocessing.freeze_support()
pool = multiprocessing.Pool(processes=10)
for x in range(2): pool.apply_async(worker, (x,))

用线程池来实现。

做个少女永远怀春 2021-12-04 00:24:44
multiprocessing.freeze_support()
pool = multiprocessing.Pool(processes=10)
for x in range(2): pool.apply_async(worker, (x,))

用线程池来实现。

旧城烟雨 2021-12-04 00:24:39

引用来自“twisted3”的评论

打印的log显示进程都终止:

1. 在i=data.get_nowait()那里单独添加一个异常处理判断data是否有数据

2. 把try .. except.. 语句中的break去掉

如日中天 2021-12-03 23:57:25

引用来自“twisted3”的评论

打印的log显示进程都终止:

1. 在i=data.get_nowait()那里单独添加一个异常处理判断data是否有数据

2. 把try .. except.. 语句中的break去掉

拥有 2021-12-03 23:47:09

引用来自“twisted3”的评论

打印的log显示进程都终止:

1. 在i=data.get_nowait()那里单独添加一个异常处理判断data是否有数据

2. 把try .. except.. 语句中的break去掉

因为看清所以看轻 2021-12-03 23:39:36

打印的log显示进程都终止:

1. 在i=data.get_nowait()那里单独添加一个异常处理判断data是否有数据

2. 把try .. except.. 语句中的break去掉

明月松间行 2021-12-03 23:05:16

引用来自“寂寞的原子”的评论

r.start()后面就 r.join()了,根本就没有多进程,而是一个进程执行完了再启动下一个。

应该把r存到一个数组里,全部start之后再join。

threads = []
for x in range(2):
    r = multiprocessing....
    r.start()
    threads.append(r)
for r in threads:
    r.join()

百思不得你姐 2021-12-03 16:20:27

r.start()后面就 r.join()了,根本就没有多进程,而是一个进程执行完了再启动下一个。

应该把r存到一个数组里,全部start之后再join。

threads = []
for x in range(2):
    r = multiprocessing....
    r.start()
    threads.append(r)
for r in threads:
    r.join()

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文