2014-02-21 27 views
12

在Linux上运行时,我现在有这样一段代码(随时上太评论:))Python的多池只有一个工人

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

在Intel的i7它产生八名工人;但是,运行Windows 8.1 Pro时,它只会产生一名工作人员。我在Linux和Windows上检查并且cpu_count()返回8。

  • 有什么我在这里失踪或做错了吗?
  • 有没有办法解决这个问题?

P.S.这是Python 2.7.6

+0

'Pool .__ init__'调用'cpu_count'来获取默认的进程数量(请参见[146行的Lib/multiprocessing/pool.py]](http://hg.python.org/cpython/file/ 3a1db0d2747e/LIB /多/ pool.py#L146))。另外'__init__'调用[line 159](http://hg.python.org/cpython/file/3a1db0d2747e/Lib/multiprocessing/pool.py#l159)上的'_repopulate_pool',它在[line 213]上执行一个循环, (http://hg.python.org/cpython/file/3a1db0d2747e/Lib/multiprocessing/pool.py#l213),它产生了正确数量的'Process'实例。你确定只有一名工人产卵吗?你如何检查工人数量? – Bakuriu

+0

我确定因为我只看到一个额外的Python进程(并且转换需要时间)。我甚至尝试过传递'Pool(processes = 8)',并且只有一名工作者产生了。 – Drakkainen

+2

尝试创建一个[最小完整代码示例,显示您的问题](http://stackoverflow.com/help/mcve)例如,使用'def f(path):print path,mp.current_process()'而不是' convert_to_png()'并启用日志记录'mp.log_to_stderr().setLevel(logging.DEBUG)'。 – jfs

回答

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使用情况。这只是我的猜测,所以如果有人有更好的解释,我很感兴趣。

相关问题