python中的多进程问题

menxin 发布于 2016/09/04 17:46
阅读 875
收藏 1
# -*- 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个进程都卡住了,麻烦帮忙看看问题在哪?谢谢

加载中
0
menxin
menxin

有没有帮忙看看的??

0
寂寞的原子
寂寞的原子

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()



0
menxin
menxin

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

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()



多谢回复,但是我改掉之后问题依然存在

0
twisted3
twisted3

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

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

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

0
menxin
menxin

引用来自“twisted3”的评论

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

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

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

我明白你的意思,这个是我随手写的一个脚本,用来下载一些mp4文件,处理上没有很严谨,但是现在的问题在于我不明白为什么会出现进程0卡住,进程1也卡住,没有继续获取id下载其他文件的情况,所以想请教一下这个问题
0
twisted3
twisted3

引用来自“twisted3”的评论

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

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

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

引用来自“menxin”的评论

我明白你的意思,这个是我随手写的一个脚本,用来下载一些mp4文件,处理上没有很严谨,但是现在的问题在于我不明白为什么会出现进程0卡住,进程1也卡住,没有继续获取id下载其他文件的情况,所以想请教一下这个问题
卡住是不是文件太大还在下载?
0
menxin
menxin

引用来自“twisted3”的评论

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

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

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

引用来自“menxin”的评论

我明白你的意思,这个是我随手写的一个脚本,用来下载一些mp4文件,处理上没有很严谨,但是现在的问题在于我不明白为什么会出现进程0卡住,进程1也卡住,没有继续获取id下载其他文件的情况,所以想请教一下这个问题

引用来自“twisted3”的评论

卡住是不是文件太大还在下载?
确实是,其他的另外的一个进程不应该卡住啊
0
qycms_cn
qycms_cn
multiprocessing.freeze_support()
pool = multiprocessing.Pool(processes=10)
for x in range(2): pool.apply_async(worker, (x,))

用线程池来实现。

0
menxin
menxin

引用来自“qycms_cn”的评论

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

用线程池来实现。

这个是进程池啊,我很疑惑的是为什么会出现上面描述的情况,谢谢


返回顶部
顶部