Pool.Apply_Async将不会循环,ValueError:池未运行

时间:2019-05-20 15:38:01

标签: python-3.x loops multiprocessing

这就是我要进行多处理的功能,它确实可以很好地加速运行。但是,它不会循环到第二页。给我“ 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中的技能非常有限,因此我的建议并不适合所有人。这是非常基本的东西。

1 个答案:

答案 0 :(得分:0)

问题已通过一个较小的解决方案得以解决:

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

如果我为论坛写2个函数并分别发布,则会发生“ ValueError:池未运行”,这两个函数都有一个循环,多个页面的范围循环和张贴循环。当我将它们合并为一个功能时,问题解决了。