python-3.x - Pool.Apply_Async 不会循环,ValueError: Pool not running
问题描述
这就是我所拥有的多处理,它运行得很好,真的加速了。但是,它不会循环到第二页。给我“ValueError:池未运行。”
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
}
response = requests.get(forum_page_url, headers=headers).content
soup = bs4.BeautifulSoup(response, 'lxml')
recommended = soup.select('tbody:has(.threadpages [src="images/new.gif"]), '
'tbody:has(.threadpages [src="images/new1.gif"]), '
for item in recommended:
for i in item.select('.folder [href^="thread-"]'):
url_tail = i['href']
url_domain = 'http://www.pop999.com/forum/'
url = urljoin(url_domain, url_tail)
# 多线程 Multiprocessing
# q = multiprocessing.Queue()
p.apply_async(download_imgs, args=(url, ))
p.apply_async(retrieve_bt_link, args=(url, ))
p.close()
p.join()
我的 close 和 join 与第一个 for 循环对齐,它不会处理到第二页,返回“ValueError:Pool not running”。有谁知道为什么以及如何?
当我结合以前的循环功能(缩写版本)时,问题得到了解决:
forum pages ranging loops:
posts for loops:
p.apply_async
p.apply_async
p.close()
p.join()
从我的理解来看,如果您在层次结构顺序中有两个以上的循环{我的是论坛循环>>帖子循环>>文件循环}(不是并行的),并且您想用多处理循环它们。我强烈建议您将它们组合在一个函数中,以避免“池未运行”ValueError。
您可以为每个功能进行多处理,我只是不确定它是否有效。我之前也遇到过几次“守护进程不允许子进程”。所以,看看它如何适应你的情况。
PS我在(CS)python方面的技能非常有限,所以我的建议并不适合所有人。这是非常基本的东西。
解决方案
问题通过小修复解决:
我的代码包含三个主要部分:1.多个论坛页面选择,2.帖子收集,3.帖子内容照片和种子下载。
如果我为论坛和每个帖子编写 2 个函数,则会发生“ValueError:池未运行”,它们都有一个循环,多个页面的范围循环和帖子的 for 循环。当我将它们合并为一个功能时,问题就解决了。
推荐阅读
- javascript - 对全分页的 Antd Table 进行排序和过滤
- windows - Windows Server 中的自定义 OTP
- amazon-ec2 - EC2 linux中带有jar文件的cron作业
- macos - 在 macOS 上配置 jmagick 时出错
- web-scraping - Fail Scrapy - 它提供一个空的输出
- ssl - nginx https 不工作
- javascript - 我想在 flexbox 中更改我的板块在 CSS 中的位置
- bash - 根据输出高亮 grep 结果以不同的颜色
- php - 实时服务器上的 VerifyCsrfToken.php 中的 TokenMismatchException
- ios - 适用于所有 iOS 设备的背景图像大小指南