首页 > 解决方案 > 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方面的技能非常有限,所以我的建议并不适合所有人。这是非常基本的东西。

标签: python-3.xloopsmultiprocessing

解决方案


问题通过小修复解决:

我的代码包含三个主要部分:1.多个论坛页面选择,2.帖子收集,3.帖子内容照片和种子下载。

如果我为论坛和每个帖子编写 2 个函数,则会发生“ValueError:池未运行”,它们都有一个循环,多个页面的范围循环和帖子的 for 循环。当我将它们合并为一个功能时,问题就解决了。


推荐阅读