5

我正在运行一个单线程 python 程序,它在我的 windows 盒子上执行大量数据处理。我的机器有 8 个处理器。当我在 Windows 任务管理器下的性能选项卡中监视 CPU 使用率时,它表明我只使用了我可用处理能力的一小部分。只有一个处理器被充分利用,其余的几乎都是空闲的。我应该怎么做才能确保我的所有处理器都被使用?多线程是解决方案吗?

4

6 回答 6

6

多线程不能使用额外的处理器或内核。

您应该生成新进程而不是新线程。

这个工具是迄今为止我遇到的最简单的工具: parallel python

概述:

PP 是一个 python 模块,它提供了在 SMP(具有多个处理器或内核的系统)和集群(通过网络连接的计算机)上并行执行 python 代码的机制。

它轻巧,易于安装并与其他 python 软件集成。

PP是一个用纯python编写的开源跨平台模块

于 2010-12-01T07:57:51.827 回答
2

单进程需要多线程,但不一定是解决方案;处理器亲和性可以将其限制为可用内核的子集,即使您有足够多的线程来使用所有内核。

于 2010-12-01T07:07:42.267 回答
2

如果您的程序属于使用python 的多处理模块受益的类型,您可以得到它

multiprocessing 使用多个 python 进程,这避免了 GIL 的问题,因此可以将所有这些内核与 python 代码一起使用它具有简单的线程映射和更复杂方案的基础

它类似于并行 python,但仅限于本地机器,包含在 python 2.6 及更高版本中,隐喻类似于 python 的线程

于 2010-12-01T07:08:09.463 回答
2

作为 Jon 所说的补充,如果您使用的是标准 Python 解释器,您应该了解多线程方面的限制。如果您的线程是纯 python 并且不进行系统调用,则由于全局解释器锁,它们不能在多个处理器上同时运行,因此多线程的好处是微乎其微的。在这种情况下,也许建议使用多个进程,或者切换到另一个没有全局解释器锁的 Python 实现,例如 JPython 或 IronPython。

于 2010-12-01T07:11:33.620 回答
1

假设您的任务是可并行化的,那么是的,线程肯定是一种解决方案。特别是,如果您有很多数据项要处理,但它们都可以独立处理,那么并行化应该相对简单。

使用多个进程而不是多个线程可能是另一种解决方案——你还没有告诉我们足够多的问题,真的。

于 2010-12-01T07:07:20.727 回答
1

做这个。

将您的任务分解为步骤或阶段。每一步都读取一些东西,进行整体计算的一部分并写入一些东西。

"""Some Step."""
import json
for some_line in sys.stdin:
    object= json.loads( some_line )
    # process the object
    json.dump( result, sys.stdout )

像这样的事情应该做得很好。

如果您有多个必须通信的对象,请制作一个简单的对象字典。

results = { 'a': a, 'b': b }

像这样将它们连接到管道中。

python step1.py | python step2.py | python step3.py >output_file.dat

如果您可以将事情分解为 8 个或更多步骤,那么您将使用 8 个或更多核心。而且,顺便说一句,对于很少的实际工作,这将非常快。

于 2010-12-01T11:07:47.917 回答