这就是我要进行多处理的功能,它确实可以很好地加速运行。但是,它不会循环到第二页。给我“ 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:池未运行”。有谁知道为什么以及如何做?
与以前的循环功能(缩写版本)结合使用时,问题已解决:
forum pages ranging loops:
posts for loops:
p.apply_async
p.apply_async
p.close()
p.join()
从我的理解来看,如果您按层次结构顺序有两个以上的循环{mine is forum loop >> post loop >> file loop}(非并行),并且您想通过多处理来循环它们。我强烈建议您将它们合并为一个函数,以避免“池未运行” ValueError。
您可以对每个功能进行多重处理,但我不确定它是否有效。我也遇到过几次“守护进程不允许子进程”。因此,请查看随后如何适合您的情况。
我在(CS)python中的技能非常有限,因此我的建议并不适合所有人。这是非常基本的东西。
答案 0 :(得分:0)
问题已通过一个较小的解决方案得以解决:
我的代码包含三个主要部分: 1.多个论坛页面选择, 2.帖子收集, 3.发布内容照片和种子下载。
如果我为论坛写2个函数并分别发布,则会发生“ ValueError:池未运行”,这两个函数都有一个循环,多个页面的范围循环和张贴循环。当我将它们合并为一个功能时,问题解决了。