多进程或线程蟒蛇?(multiprocess or threading in python?)

2019-06-18 00:16发布

我有抓住数据的集合,对于集合中的每个数据块将执行任务的Python应用程序。 该任务需要一些时间才能完成,因为这牵涉到延迟。 由于这种延迟的,我不希望每一块数据的随后执行任务,我希望他们全部被并联发生。 我应该使用多进程? 或线程执行此操作?

我试图使用线程但遇到了一些麻烦,往往一些任务永远不会真正火。

Answer 1:

如果你是真正的计算绑定,采用多模块可能是重量最轻的解决方案(在内存消耗和实现难度而言。)

如果你是I / O限制,使用线程模块通常会为您提供良好的效果。 请确保您使用的线程安全存储(如队列)将数据交给你的线程。 要不然递给他们一整块数据的他们正在催生时是独有的东西。

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

无堆栈的Python也是一个不错的主意。 无堆栈具有便携性问题,如上所示。 空载燕子是有希望的,但现在已经不存在。 Pyston是另一个(未完成)Python实现对焦速度。 它正在向PyPy不同的方法,这可产生更好的(或只是不同)的加速比。



Answer 2:

任务运行的顺序一样,但你有并行运行的假象。 当您使用的文件或连接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


Answer 3:

对于数据的小型集合,简单地创建子进程subprocess.Popen 。

每个子流程可以简单地把它的标准输入或命令行参数的数据块,做它的处理,并简单地把结果写入到输出文件。

当子过程都完成(或超时),您只需合并输出文件。

非常简单。



Answer 4:

你可能会考虑寻找到无堆栈的Python 。 如果你能控制的,需要一个较长时间的功能,你可以抛出一些stackless.schedule()在里面(话说产量到下一个协程),否则你可以设置无堆栈,以抢占式多任务 。

在无堆栈,你没有线程,但任务蕾greenlets本质上属于非常轻量级线程。 它在这个意义上,有很少的设置,以获得多任务会相当不错的框架的伟大工程。

然而,无堆栈阻碍了便携性,因为你必须更换一些标准的Python库 - 无堆栈删除C堆栈上的依赖。 这是如果未来用户还安装了无堆栈非常便携,但很少会这样。



Answer 5:

使用CPython的线程模型不会给你任何的性能提升,因为线程不并行实际执行中,由于垃圾收集的处理方式。 多进程允许并行执行。 显然,在这种情况下,你必须有可用的种田了您的并行作业多个内核。

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



Answer 6:

如果你可以很容易地分区和分开你的数据,这听起来像你应该做的分区外,并把它们喂到你的程序的几个过程。 (即几个进程而不是线程)



Answer 7:

IronPython的具有真正的多线程,不像CPython的,它的GIL。 所以,这取决于你在做什么,它可能是值得考虑的。 但它听起来像是你的使用情况是更适合于多模块。

为了谁建议无堆叠蟒蛇的家伙,我不是这方面的专家,但在我看来,他在谈论软件“多线程”,这实际上是不是在所有平行(仍然运行在一个物理线程,因此不能扩展到多核。)这是仅仅构建异步(但仍然单线程的,非平行的)应用程序的替代方式。



Answer 8:

你可能想看看扭曲 。 它是专为异步网络的任务。



文章来源: multiprocess or threading in python?