1. 程式人生 > >【Python】多程序的程序池pool執行時報錯:ValueError: Pool not running

【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