加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-17 01:23:10 所属栏目:Python 来源:网络整理
导读:span style="color:rgb(51,51,51);font-family:'-apple-system','Helvetica Neue',Helvetica,Arial,'PingFang SC','Hiragino Sans GB','WenQuanYi Micro Hei','Microsoft Yahei',sans-serif;font-size:14px;" span style="font-size:14px;"【笔记】 这个问题

<span style="color:rgb(51,51,51);font-family:'-apple-system','Helvetica Neue',Helvetica,Arial,'PingFang SC','Hiragino Sans GB','WenQuanYi Micro Hei','Microsoft Yahei',sans-serif;font-size:14px;">

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

<pre class="hljs stylus" style="overflow:auto;font-family:'Source Code Pro',Consolas,Menlo,Monaco,'Courier New',monospace;font-size:.93em;line-height:1.45;color:rgb(51,51);border:none;"><code style="font-family:'Source Code Pro',monospace;font-size:1em;color:inherit;background:none;"><span class="hljs-selector-tag" style="font-weight:bold;">p = Pool(<span class="hljs-number" style="color:rgb(0,128,128);">10)
<span class="hljs-keyword" style="font-weight:bold;">for key <span class="hljs-keyword" style="font-weight:bold;">in <span class="hljs-selector-tag" style="font-weight:bold;">dd.keys():
createDirs(key)<span class="hljs-comment" style="color:rgb(153,153,136);">//创建目录
urls = img_url(<span class="hljs-selector-tag" style="font-weight:bold;">dd[key])<span class="hljs-comment" style="color:rgb(153,136);">//返回图片地址
<span class="hljs-keyword" style="font-weight:bold;">for index,url <span class="hljs-keyword" style="font-weight:bold;">in enumerate(urls):
patch = <span class="hljs-string" style="color:rgb(221,17,68);">'{}/{}.jpg'.format(key,index)
<span class="hljs-keyword" style="font-weight:bold;">if(url <span class="hljs-keyword" style="font-weight:bold;">in didload):<span class="hljs-comment" style="color:rgb(153,136);">//判断是否已经载过
print(patch,<span class="hljs-string" style="color:rgb(221,68);">'下载过了')
<span class="hljs-keyword" style="font-weight:bold;">else:
url = <span class="hljs-selector-tag" style="font-weight:bold;">p.apply_async(dowload_img,args=(url,patch))<span class="hljs-comment" style="color:rgb(153,136);">//下载图片
<span class="hljs-keyword" style="font-weight:bold;">if url:
didload.append(url)<span class="hljs-comment" style="color:rgb(153,136);">//将已下载的地址保存
<span class="hljs-selector-tag" style="font-weight:bold;">p.close()
<span class="hljs-selector-tag" style="font-weight:bold;">p.join()<p style="color:rgb(51,sans-serif;font-size:14px;">下载图片的代码如下:

<code class="language-python"><code style="font-family:'Source Code Pro',monospace;font-size:1em;color:inherit;background:none;"><span class="hljs-function"><span class="hljs-keyword" style="font-weight:bold;">def <span class="hljs-title" style="color:rgb(153,0);font-weight:bold;">dowload_img<span class="hljs-params">(url,name):
content2 = str()
driver = webdriver.PhantomJS()
driver.get(url)
time.sleep(<span class="hljs-number" style="color:rgb(0,128);">3)
pageSource = driver.page_source
bsobj = BeautifulSoup(pageSource,68);">"html5lib")
driver.close()
nameList = bsobj.findAll(<span class="hljs-string" style="color:rgb(221,68);">'img',{<span class="hljs-string" style="color:rgb(221,68);">'id':re.compile(<span class="hljs-string" style="color:rgb(221,68);">'img(0-9)*')})
imgurl = nameList[<span class="hljs-number" style="color:rgb(0,128);">0][<span class="hljs-string" style="color:rgb(221,68);">'src']
print(time.strftime( <span class="hljs-string" style="color:rgb(221,68);">'%Y-%m-%d %X',time.localtime() ),68);">':正在下载',name)
<span class="hljs-keyword" style="font-weight:bold;">try:
content2 = urlopen(imgurl).read()
print(time.strftime( <span class="hljs-string" style="color:rgb(221,name,68);">'下载完成')
<span class="hljs-comment" style="color:rgb(153,136);"># return (content2)
<span class="hljs-keyword" style="font-weight:bold;">except:
<span class="hljs-string" style="color:rgb(221,68);">'''记录出错的url'''
print(time.strftime( <span class="hljs-string" style="color:rgb(221,68);">'下载出错')
<span class="hljs-keyword" style="font-weight:bold;">with open(<span class="hljs-string" style="color:rgb(221,68);">'errorurl.txt',68);">'w') <span class="hljs-keyword" style="font-weight:bold;">as ff:
ff.write(imgurl)
<span class="hljs-comment" style="color:rgb(153,136);"># return None
<span class="hljs-keyword" style="font-weight:bold;">finally:
<span class="hljs-keyword" style="font-weight:bold;">with open(name,68);">'wb') <span class="hljs-keyword" style="font-weight:bold;">as pp:
pp.write(content2)
<span class="hljs-string" style="color:rgb(221,68);">'''记录已下载url'''
print(<span class="hljs-string" style="color:rgb(221,68);">'记录',name)
<span class="hljs-keyword" style="font-weight:bold;">return (url)
<p style="color:rgb(51,sans-serif;font-size:14px;">现在遇到两个问题:
1、如果运行代码的时候,刚好碰到已下载的,就不会再下载。一般连续两个目录也就是差不错70张左右不用下载的时候,程序就崩溃了。报ValueError: Pool not running错误。
2、我用KeyboardInterrupt捕捉中断,但是用了Pool以后就不起作用了

<pre class="hljs vim" style="overflow:auto;font-family:'Source Code Pro',monospace;font-size:1em;color:inherit;background:none;"> except KeyboardInterrup<span class="hljs-variable" style="color:rgb(0,128);">t:
<span class="hljs-keyword" style="font-weight:bold;">print(<span class="hljs-string" style="color:rgb(221,68);">'运行中断ctrl+c')
with <span class="hljs-keyword" style="font-weight:bold;">open(<span class="hljs-string" style="color:rgb(221,68);">'didload.txt',68);">'w') <span class="hljs-keyword" style="font-weight:bold;">as ff:
ff.<span class="hljs-keyword" style="font-weight:bold;">write(<span class="hljs-string" style="color:rgb(221,68);">','.<span class="hljs-keyword" style="font-weight:bold;">join(didload))<p style="color:rgb(51,sans-serif;font-size:14px;">可以捕捉到KeyboardInterrupt,但是后面的代码没有运行,程序也不会完全中断。

<p style="color:rgb(51,sans-serif;font-size:14px;">请高手指点一下,谢谢~~

<span style="color:rgb(51,sans-serif;font-size:14px;">

<span style="color:rgb(51,sans-serif;font-size:14px;">解决:

<span style="color:rgb(51,sans-serif;font-size:14px;">

<pre class="hljs stylus" style="overflow:auto;font-family:'Source Code Pro',monospace;font-size:1em;color:inherit;background:none;"><span class="hljs-selector-tag" style="font-weight:bold;">p.close()
<span class="hljs-selector-tag" style="font-weight:bold;">p.join()<p style="color:rgb(51,sans-serif;font-size:14px;">不该写在最外层么?为什么写在?<code style="font-family:'Source Code Pro',monospace;font-size:.93em;color:rgb(199,37,78);background-color:rgb(249,242,244);">for key in dd.keys():?里面?

<p style="color:rgb(51,sans-serif;font-size:14px;">转自:https://segmentfault.com/q/1010000011398851


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读