【Python】多进程的进程池pool运行时报错:ValueError: Pool not running

【笔记】
这个问题的根源在于:pool.close()提前生效,关闭了pool。所以提示pool没有运行。
=============================================
我刚接触python爬虫,所以有些地方不是很懂。
我最近写了一个python爬虫,作用是从一个动漫网站上爬图片。
由于一张一张下载太慢,我用了并发的方法Pool。

p = Pool(10)
for key in dd.keys():
    createDirs(key)//创建目录
    urls = img_url(dd[key])//返回图片地址
    for index,url in enumerate(urls):
        patch = '{}/{}.jpg'.format(key,index)
        if(url in didload)://判断是否已经载过
            print(patch,'下载过了')
        else:
            url = p.apply_async(dowload_img, args=(url,patch))//下载图片
            if url:
                didload.append(url)//将已下载的地址保存
    p.close()
    p.join()

下载图片的代码如下:

def dowload_img(url,name):
    content2 = str()
    driver = webdriver.PhantomJS()
    driver.get(url)
    time.sleep(3)
    pageSource = driver.page_source
    bsobj = BeautifulSoup(pageSource,"html5lib")
    driver.close()
    nameList = bsobj.findAll('img',{'id':re.compile('img(0-9)*')})
    imgurl = nameList[0]['src']
    print(time.strftime( '%Y-%m-%d %X', time.localtime() ),':正在下载',name)
    try:
        content2 = urlopen(imgurl).read()
        print(time.strftime( '%Y-%m-%d %X', time.localtime() ),name,'下载完成')
        # return  (content2)
    except:
        '''记录出错的url'''
        print(time.strftime( '%Y-%m-%d %X', time.localtime() ),name,'下载出错')
        with open('errorurl.txt','w') as ff:
            ff.write(imgurl)
        # return  None
    finally:
        with open(name,'wb') as pp:
            pp.write(content2)
            '''记录已下载url'''
            print('记录',name)
            return (url)

现在遇到两个问题:
1、如果运行代码的时候,刚好碰到已下载的,就不会再下载。一般连续两个目录也就是差不错70张左右不用下载的时候,程序就崩溃了。报ValueError: Pool not running错误。
2、我用KeyboardInterrupt捕捉中断,但是用了Pool以后就不起作用了

    except KeyboardInterrupt:
        print('运行中断ctrl+c')
        with open('didload.txt','w') as ff:
            ff.write(','.join(didload))

可以捕捉到KeyboardInterrupt,但是后面的代码没有运行,程序也不会完全中断。

请高手指点一下,谢谢~~


解决:

p.close()
p.join()

不该写在最外层么?为什么写在 for key in dd.keys(): 里面?

转自:https://segmentfault.com/q/1010000011398851


发布了392 篇原创文章 · 获赞 492 · 访问量 241万+
展开阅读全文

Python多进程问题的报错问题

12-09

小弟想通过多进程实现客户端给服务器发送信息,服务器同时接收多个信息。但是会收到以下报错: OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 看网上说是进程停止又重启造成的结果 小弟贴下自己的代码,麻烦大家看下 ``` import multiprocessing from socket import import time server_name='172.20.53.211' port_number1=12002 port_number2=12003 def process_one(): server_socket1 = socket(AF_INET, SOCK_DGRAM) server_socket1.bind(('', port_number1)) data_receive1, client_address = server_socket1.recvfrom(1024) server_socket1.close() print(data_receive1,1) def process_two(): server_socket2 = socket(AF_INET, SOCK_DGRAM) server_socket2.bind(('', port_number2)) data_receive2, client_address = server_socket2.recvfrom(1024) server_socket2.close() print(data_receive2,2) p1=multiprocessing.Process(target=process_one()) p1.start() p2=multiprocessing.Process(target=process_two()) p2.start() ``` 以上是服务器端的代码 以下是客户端发送代码 ``` from socket import * import time server_name='172.20.53.211' port_number1=12002 port_number2=12003 client_socket = socket(AF_INET, SOCK_DGRAM) f1=open('1.txt','rb') fcontent=f1.read() client_socket.sendto(fcontent,(server_name, port_number1)) time.sleep(0.2) client_socket.sendto('a'.encode('UTF-8'),(server_name, port_number2)) client_socket.close() ``` 求大佬指出哪里错了,谢谢 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览