Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的多进程还是线程?_Python_Multithreading_Multiprocess - Fatal编程技术网

python中的多进程还是线程?

python中的多进程还是线程?,python,multithreading,multiprocess,Python,Multithreading,Multiprocess,我有一个python应用程序,它获取一个数据集合,并为该集合中的每个数据执行一项任务。这项任务需要一段时间才能完成,因为需要延迟。由于这种延迟,我不希望每个数据块随后执行任务,我希望它们都并行发生。我应该使用多进程吗?还是执行此操作的线程 我尝试使用线程,但遇到了一些问题,通常一些任务永远不会真正启动。使用CPython的线程模型不会给您带来任何性能改进,因为由于垃圾收集的处理方式,线程实际上不是并行执行的。多进程将允许并行执行。显然,在这种情况下,您必须有多个可用的内核,才能将并行作业分包到

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


我尝试使用线程,但遇到了一些问题,通常一些任务永远不会真正启动。

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


中提供了更多信息。

对于小型数据集合,只需使用创建子流程即可

每个子进程只需从stdin或命令行参数获取它的一段数据,进行处理,并将结果写入输出文件

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


<>很简单。

你可以考虑一下。如果您可以控制需要很长时间的函数,您可以在其中抛出一些
stackless.schedule()
s(表示屈服于下一个协同程序),否则您可以

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


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

如果您真的受计算限制,那么使用可能是最轻的解决方案(就内存消耗和实现难度而言)

如果您受I/O限制,使用通常会得到很好的结果。确保使用线程安全存储(如队列)将数据传递给线程。或者,在生成数据时,为它们提供一条唯一的数据

专注于表现。它有许多特性可以帮助进行计算绑定处理。它们还支持软件事务性内存,尽管这还不符合生产质量。其承诺是,您可以使用比多处理(有一些棘手的要求)更简单的并行或并发机制


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

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

IronPython具有真正的多线程功能,与CPython不同,它是GIL。因此,根据你在做什么,它可能值得一看。但听起来您的用例更适合于多处理模块


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

任务按顺序运行,但您会产生并行运行的错觉。任务在用于文件或连接I/O时很好,因为它们很轻

带池的多进程可能是适合您的解决方案,因为进程并行运行,因此非常适合密集计算,因为每个进程在一个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

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

你的“数据收集”有多大。如果它很大,您可能不希望为每个线程或进程启动线程或进程。通常是1、2或3条数据。@s.Lott-您如何将线程/进程的数量限制为远小于数据大小的数量?@Adam Greenhall:这是一个不相关的问题;这就是多进程池的用途。我还在努力理解这个问题。如果有10000条数据,那么10000个并发进程(或线程)似乎是一个非常糟糕的主意。如果只有3个,那么这似乎不值得问,因为最简单的解决方案是最有效的。这是不正确的。它不会给你带来更多的性能提升,如C或C++,但是确实会发生一些并发。特别是当你被I/O束缚的时候,做一些线程来帮助你。我没有意识到这一点-谢谢你提供的信息。这里有一个外部引用:。在这个基准测试中,您可以看到所描述的I/O绑定问题的改进。然而,值得指出的是,CPU受限的问题实际上在2个Python线程中运行得比在1个线程中运行得慢!似乎为你的应用程序进行分析是必要的。这是一个非常繁重的解决方案。您不仅需要安排将数据馈送到外部进程,而且还需要大量的开销。@Christopher。关键是简单。Unix世界已经使用此技术40年了。它工作得很好,因为它很简单。此外,由于您正在运行同一个二进制映像的多个实例,因此开销并不是真正的“巨大”。GNU/Linux对它进行了很好的优化。@S.Lott:仅仅因为它已经使用了很长时间,并不意味着它是一个好的解决方案。这尤其不可能