32

我有一个 python 应用程序,它可以获取数据集合,并且对于该集合中的每条数据,它都会执行一项任务。该任务需要一些时间才能完成,因为存在延迟。由于这种延迟,我不希望每条数据随后都执行任务,我希望它们都并行发生。我应该使用多进程吗?或线程这个操作?

我尝试使用线程但遇到了一些麻烦,通常有些任务永远不会真正触发。

4

8 回答 8

30

如果您真的受计算限制,使用多处理模块可能是最轻量级的解决方案(就内存消耗和实现难度而言)。

如果您受 I/O 限制,使用threading 模块通常会给您带来很好的结果。确保使用线程安全存储(如队列)将数据交给线程。或者,在他们生成时,交给他们一个独特的数据。

PyPy专注于性能。它具有许多有助于计算密集型处理的功能。他们还支持软件事务内存,尽管这还不是生产质量。承诺是您可以使用比多处理更简单的并行或并发机制(这有一些尴尬的要求。)

Stackless Python也是一个好主意。如上所述,Stackless 存在可移植性问题。Unladen Swallow很有希望,但现在已经不复存在了。Pyston是另一个(未完成)专注于速度的 Python 实现。它采用了与 PyPy 不同的方法,这可能会产生更好(或只是不同)的加速。

于 2009-08-04T12:26:14.273 回答
9

任务按顺序运行,但您有并行运行的错觉。当您用于文件或连接 I/O 时,任务很好,因为它们是轻量级的。

Multiprocess with Pool 可能是适合您的解决方案,因为进程并行运行,因此非常适合密集计算,因为每个进程都在一个 CPU(或核心)中运行。

设置多进程可能非常简单:

from multiprocessing import Pool

def worker(input_item):
    output = do_some_work()
    return output

pool = Pool() # it make one process for each CPU (or core) of your PC. Use "Pool(4)" to force to use 4 processes, for example.
list_of_results = pool.map(worker, input_list) # Launch all automatically
于 2010-01-26T03:13:17.000 回答
7

对于少量数据,只需使用 subprocess.Popen 创建子流程

每个子进程都可以简单地从标准输入或命令行参数获取它的数据,进行处理,然后简单地将结果写入输出文件。

当子流程全部完成(或超时)后,您只需合并输出文件。

很简单。

于 2009-08-04T10:31:42.980 回答
7

您可能会考虑研究Stackless Python。如果你可以控制需要很长时间的函数,你可以stackless.schedule()在里面扔一些 s(说让下一个协程),或者你可以将 Stackless 设置为抢占式多任务

在 Stackless 中,您没有线程,但taskletgreenlet本质上是非常轻量级的线程。它工作得很好,因为有一个非常好的框架,只需很少的设置就可以进行多任务处理。

然而,Stackless 阻碍了可移植性,因为您必须替换一些标准 Python 库——Stackless 消除了对 C 堆栈的依赖。如果下一个用户也安装了 Stackless,那么它非常便携,但这种情况很少见。

于 2009-08-04T11:06:41.927 回答
0

你可能想看看Twisted。它专为异步网络任务而设计。

于 2010-01-26T03:17:43.060 回答
0

如果您可以轻松地对拥有的数据进行分区和分离,那么听起来您应该只在外部进行分区,并将它们提供给程序的多个进程。(即几个进程而不是线程)

于 2009-08-04T13:45:04.430 回答
0

IronPython 具有真正的多线程,这与 CPython 和 GIL 不同。所以取决于你在做什么,它可能值得一看。但听起来您的用例更适合多处理模块。

对于推荐 stackless python 的人,我不是这方面的专家,但在我看来,他说的是软件“多线程”,实际上根本不是并行的(仍然在一个物理线程中运行,因此无法扩展到多核。)它只是构建异步(但仍然是单线程、非并行)应用程序的另一种方式。

于 2009-08-10T01:31:12.340 回答
0

使用 CPython 的线程模型不会给您带来任何性能改进,因为线程实际上并没有并行执行,这是由于垃圾收集的处理方式。多进程将允许并行执行。显然,在这种情况下,您必须有多个内核可用于将您的并行作业分包出去。

此相关问题中有更多可用信息。

于 2009-08-04T10:10:58.137 回答