Python中是使用多进程还是多线程?

32 投票
8 回答
18904 浏览
提问于 2025-04-15 13:22

我有一个用Python写的应用程序,它会获取一组数据,然后对每一条数据执行一个任务。这个任务需要一些时间来完成,因为中间有延迟。由于这个延迟,我不想让每条数据一个接一个地执行任务,而是希望它们能够同时进行。请问我应该使用多进程(multiprocess)还是线程(threading)来实现这个操作呢?

我试过使用线程,但遇到了一些问题,很多任务有时根本不会执行。

8 个回答

7

你可以考虑看看 Stackless Python。如果你能控制那个耗时很长的函数,你可以在里面加一些 stackless.schedule()(这就像是告诉程序去执行下一个任务),或者你也可以 设置 Stackless 为抢占式多任务处理

在 Stackless 中,你没有传统意义上的线程,而是有一些叫做 taskletsgreenlets 的东西,它们实际上是非常轻量级的线程。这样做的好处是,你可以很轻松地搭建一个框架来实现多任务处理,几乎不需要复杂的设置。

不过,Stackless 在可移植性上有点问题,因为你需要替换一些标准的 Python 库——Stackless 不再依赖 C 语言的调用栈。如果下一个用户也安装了 Stackless,那它的可移植性就很好,但这种情况其实很少见。

9

任务看起来是顺序执行的,但实际上你会觉得它们是同时进行的。任务在处理文件或连接输入输出时非常有用,因为它们占用的资源很少。

使用多进程池可能是一个合适的解决方案,因为进程是并行运行的,这对于需要大量计算的任务非常好,因为每个进程都可以在一个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
30

如果你的程序主要是计算密集型的,使用 multiprocessing模块 可能是最轻量的解决方案,这在内存使用和实现难度上都比较简单。

如果你的程序主要是输入输出密集型的,使用 threading模块 通常会有不错的效果。确保你使用线程安全的存储方式(比如队列)来给你的线程传递数据。或者在创建线程时,给它们一个独特的数据。

PyPy 主要关注性能。它有一些功能可以帮助处理计算密集型的任务。它还支持软件事务内存,虽然目前还不够成熟。它的优势在于你可以使用比multiprocessing更简单的并行或并发机制(后者有些要求比较麻烦)。

Stackless Python 也是个不错的想法。Stackless在可移植性上有一些问题。 Unladen Swallow 曾经很有前景,但现在已经停止更新。 Pyston 是另一个(尚未完成的)Python实现,专注于速度。它采用了与PyPy不同的方法,可能会带来更好的(或只是不同的)速度提升。

撰写回答