【Python】多程序的程序池pool執行時報錯:ValueError: Pool not running
阿新 • • 發佈:2019-02-10
【筆記】
這個問題的根源在於: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