Windows 8.1上的Python多进程池只生成一个工作进程

13

我目前有这段代码(欢迎对它进行评论 :))

def threaded_convert_to_png(self):
    paths = self.get_pages()
    pool = Pool()
    result = pool.map(convert_to_png, paths)
    self.image_path = result

在Linux上,它在Intel i7上生成八个工作进程;然而,在Windows 8.1 Pro上运行时,它仅生成一个工作进程。我检查了cpu_count()在Linux和Windows上都返回8。

  • 我是否漏掉了什么,或者做错了什么?
  • 有没有解决这个问题的方法?

附:这是在Python 2.7.6中。


Pool.__init__и°ғз”Ёcpu_countжқҘиҺ·еҸ–й»ҳи®Өзҡ„иҝӣзЁӢж•°йҮҸпјҲеҸӮи§ҒLib/multiprocessing/pool.py 第146иЎҢпјүгҖӮжӯӨеӨ–пјҢ__init__ еңЁline 159и°ғз”ЁдәҶ _repopulate_poolпјҢиҜҘеҮҪж•°еңЁline 213дёҠжү§иЎҢдёҖдёӘеҫӘзҺҜпјҢз”ҹжҲҗжӯЈзЎ®ж•°йҮҸзҡ„ Process е®һдҫӢгҖӮдҪ зЎ®е®ҡеҸӘжңүдёҖдёӘе·ҘдҪңиҝӣзЁӢиў«з”ҹжҲҗдәҶеҗ—пјҹдҪ жҳҜеҰӮдҪ•жЈҖжҹҘе·ҘдҪңиҝӣзЁӢж•°йҮҸзҡ„е‘ўпјҹ - Bakuriu
我确定这是因为我只看到了一个额外的Python进程(而且转换需要很长时间)。我甚至尝试传递Pool(processes=8),但仍然只有一个工作进程被生成。 - Drakkainen
2
尝试创建一个最小完整的代码示例,展示您的问题,例如使用def f(path): print path, mp.current_process()代替convert_to_png()并启用日志记录mp.log_to_stderr().setLevel(logging.DEBUG) - jfs
1
len(paths) 是什么? - jfs
1
你是否正确地将脚本包含在 if __name__ == '__main__': 中,并且 convert_to_png 是否在其外部正确定义?(文档链接:http://docs.python.org/2/library/multiprocessing.html) - Matt
显示剩余7条评论
2个回答

1

有一种简单的方法可以确定您的池中发生了什么-打开多进程调试。 您可以按照以下方式操作:

import logging
from multiprocessing import util

util.log_to_stderr(level=logging.DEBUG)

在脚本运行时,您将获得有关正在运行、生成和退出进程的完整信息。
但是,无论如何,进程池始终会生成N个进程(其中N是“进程”参数值或cpu_count),但任务在进程之间的分配可能不均匀-这取决于任务运行时间。

1
我解决了类似的问题。不确定是否对您有所帮助,但我还是决定在这里记录下来,以防能够帮助到其他人。
我的情况是要分析大量推文(总共52000条),将它们分成多个处理器进行处理。在OSX和服务器上运行良好,但在Windows 8.1上非常缓慢,进程逐个激活。通过查看任务管理器,我注意到主Python进程的内存使用量不断上升,达到了约1.5Gb。工作进程的内存使用量也同样攀升。现在我注意到旧版本可以正常工作,该版本具有稍微不同的算法。最后,问题是当我仅需要推文的文本部分时,我从数据库中检索整个推文。这显然导致了内存使用量增加。修复了这一部分后,程序可以正确启动工作进程。
因此,根据我的经验,我有一个猜测,即Windows试图通过阻止工作进程来控制RAM使用情况。如果是这样,请检查您的进程的RAM使用情况。这只是我的猜测,所以我很感兴趣,如果有人有更好的解释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接