我正在运行一个单线程python程序,它在我的Windows框上执行大量数据处理。我的机器有8个处理器。当我在Windows任务管理器下的性能选项卡中监视CPU使用情况时,它表明我只使用了可用处理能力的一小部分。只有一个处理器被充分利用,其余所有处理器几乎都处于空闲状态。我该怎么做才能确保使用我的所有处理器?多线程是解决方案吗?
答案 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个或更多核心。而且,顺便说一句,对于很少的实际工作来说,这将是非常快的。