【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


评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值