如何编程以使用您机器上的所有处理器?

时间:2010-12-01 07:04:54

标签: python windows processor

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

6 个答案:

答案 0 :(得分:6)

多线程无法使用额外的处理器或内核。

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

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

  

概述:

     

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

     

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

     PP是一个纯粹的开源和跨平台模块   蟒

答案 1 :(得分:2)

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

答案 2 :(得分:2)

如果你的程序属于使用python's multiprocessing module

的类型,你可以得到它

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

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

答案 3 :(得分:2)

作为Jon所说的补充,如果你使用标准的Python解释器,你应该理解多线程的局限性。如果您的线程是纯python并且没有进行系统调用,则由于Global Interpreter Lock它们无法在多个处理器上并发运行,因此多线程的优势很小。在这种情况下,建议可能是改为使用多个进程,或者切换到另一个Python实现,例如JPython或IronPython,它们没有全局解释器锁。

答案 4 :(得分:1)

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

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

答案 5 :(得分: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个或更多核心。而且,顺便说一句,对于很少的实际工作来说,这将是非常快的。