首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中多进程、异步、线程和concurrency.futures的区别

python中多进程、异步、线程和concurrency.futures的区别
EN

Stack Overflow用户
提问于 2020-04-21 19:39:57
回答 1查看 8.8K关注 0票数 36

对于使用并发性,我感到困惑的是什么时候应该使用不同的python并发库。据我理解,多线程、多线程和异步编程是并发性的一部分,而multiprocessing是称为并行性的并发子集的一部分。

我在web上搜索了在python中实现并发的不同方法,并遇到了多处理库concurrenct.futures‘ProcessPoolExecutor()和ThreadPoolExecutor()和异步。让我困惑的是这些图书馆之间的区别。特别是多进程库所做的工作,因为它有像pool.apply_async这样的方法,它也做异步的工作吗?如果是这样的话,为什么在实现异步并发(多进程与协作多任务处理)的方法不同时,它被称为多进程?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-22 08:10:21

有几个不同的图书馆在发挥作用:

  • threading:与操作系统级线程的接口.请注意,CPU绑定的工作主要是由吉尔序列化的,所以不要期望线程处理会加快计算速度。当您需要并行调用阻塞API时,以及当您需要对线程创建进行精确控制时,请使用它。避免创建过多的线程(例如数千个线程),因为它们不是免费的。如果可能的话,不要自己创建线程,而是使用concurrent.futures
  • multiprocessing:使用一个有意类似于threading的API生成多个python进程的接口。多个进程并行工作,因此实际上可以使用此方法加快计算速度。缺点是,如果不使用多处理特定的工具,就无法共享内存中的数据结构。
  • concurrent.futuresthreadingmultiprocessing的现代接口,它提供了方便的线程/进程池,它调用了执行器。池的主要入口点是submit方法,它返回一个可以测试以完成或等待其结果的手柄。获得结果将为您提供提交函数的返回值,并正确传播引发的异常(如果有的话),这对threading来说是很麻烦的。在考虑线程或基于进程的并行性时,concurrent.futures应该是首选的工具。
  • asyncio:虽然前面的选项是“异步”的,因为它们提供了非阻塞API(这就是apply_async所指的方法),但它们仍然依赖线程/进程池来实现它们的魔力,并且不能比池中的工作人员并行完成更多的事情。Asyncio是不同的:它使用单个执行线程和异步系统调用。它根本没有阻塞调用,唯一的阻塞部分是asyncio.run()入口点。Asyncio代码通常使用coroutines编写,coroutines使用await挂起,直到发生有趣的事情。(挂起与阻塞不同,因为它允许事件循环线程在等待时继续处理其他事情。)与基于线程的解决方案相比,它有许多优点,例如能够在不困扰系统的情况下生成数千个廉价的“任务”,并且能够同时取消任务或轻松地等待多个任务。Asyncio应该是服务器和连接到多台服务器的客户端的首选工具。

在异步和多线程/多线程之间进行选择时,请考虑一句谚语:线程用于并行工作,异步用于并行等待。

还请注意,异步可以在由已执行提供的线程或进程池中等待函数concurrent.futures,因此它可以充当所有不同模型之间的粘合剂。这是异步经常用于构建新的库基础结构的原因之一。

票数 62
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61351844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档