在网上发布了很多文章之后,这是我对并发程序的理解-
在python中,如果我们有CPU绑定任务,那么我们可以利用多处理模块(原因GIL)。如果我们正在做网络I / O或磁盘I / O那么我们就可以利用多线程了。
[在此之前,我试图了解所有这些内容的基础知识,这是我对它们的想法-
在多线程环境中同步:任务在以下位置执行不同的线程,但是要等待其他任何正在执行的任务线程。
异步:单线程:任务开始执行而无需等待完成另一项任务。在给定的时间完成一项任务被执行。多线程:任务在不同的线程中执行无需等待任何任务即可独立完成任务处决。
异步编程模型可帮助我们实现并发。多线程环境中的异步编程模型是一种实现并行性的方法。
所以我的理解可以归结为使用异步库中的事件循环运行线程,greenlet和协程。
我们可以使用线程来实现异步行为(如果我们不安排线程os调度,上下文切换和内存开销),那么我们可以从这三种范式中受益。
[请提供一些实际和生产级别的示例,并说明使用它们的原因。
谢谢
多线程
由于GIL,我没有看到线程使用太多。 Uwsgi,celery和其他框架提供了基于线程的工作程序。线程的一些优点是:多进程
Uwsgi / Celery :)在我的经验中,这是默认的并发原语,因为可能进行并行处理,竞争条件,标准库支持和非GIL的可能性较小。优点:
Asyncio
这对于Web或网络框架极为普遍,因为它们的大部分工作通常是基于IO的工作负载。异步IO使单个线程可以一次处理成百上千,成千上万甚至一百万个:)连接。将此与基于前叉或基于流程的模型进行比较,该模型将需要一个可用于每个并发请求的流程。
其主要缺点是,由于异步IO框架通常是单线程的,因此任何与CPU绑定的工作负载都将阻止事件循环的前进,这对于像node / v8这样的运行时是一个非常常见的操作问题。