编程语言应用

首页 » 常识 » 诊断 » Python异步编程和事件驱动
TUhjnbcbe - 2025/4/11 16:57:00
白癜风哪里权威 http://pf.39.net/bdfyy/bdfzd/

1.异步编程

[1]同步和异步描述的是进程/线程的调用方式

同步和异步

同步调用指的是线程发起调用后,一直等待调用返回后才继续执下一步操作,这并代表CPU在这段时间内也会一直等待,操作系统多半会切换到另一个线程上去,等到调用返回后再切换回原来的线程。

异步就相反,发起调用后,线程继续向下执,当调用返回后,通过某种手段来通知调用者。

解释和说明

我们需要注意同步和异步过程中的调用返回,指的是内核进程将数据复制到调用进程。上面说的顺序式编程里面,通常调用就是同步的,上一步执行结束之后才会执行下一步。而异步编程中,如果遇到等待的操作,会继续往下执行,直到请求返回结果在进行处理。

写一个使用多线程或多进程抓取网站内容的爬虫,但由于网络请求或对方网站等问题,导致某段时间内的请求网站请求很慢。即使设置的超时时间,那么在超时时间到来之前,这些进程或线程都是一个等待的状态,什么也干不了。

而异步编程就很适合使用在如上的场景中,它可以通过切换任务的方式尽量减少闲置时间。如遇到等待的请求就先回跳过并执行下一个请求,等执行完成之后再回到这个请求。如果还是没有就绪,就切换到下下一个请求。

[2]同步和异步编程模型解释及其图示说明

单线程的同步模型

在一个时刻,只能有一个任务在执,并且前一个任务结束后一个任务才能开始。如果任务都能按照事先规定好的顺序执,最后一个任务的完成意味着所有任务都完成。

多线程/多进程的同步模型

每个任务都在单独的线程/进程中完成,且都是由操作系统来管理的。如果在多核CPU的系统里面,它们可能会相互独立的运行,而在单核中会交替的运行。

异步编程模型

这个任务是在单线程的控制下任务交错完成的,相对于多线程或多进程简单很多,没有了内容复制、资源传递的问题。而且,程序的控制权完全在我们手里,而不会被操作系统收回自行处理。

在这种异步编程模型,开发者只需要将任务组织成为一个序列,交替的小步完成。每一个异步调用需要足够的小,当然不能耗时太久。

可以看到下一图中的这种模型,并没有看到异步编程的太多的优势的,而且线程之间的切换还会带来额外的开销。异步编程,适应于那些任务强制等待或者阻塞的时候,才能发挥其优势所在。

那些任务强制等待或者阻塞的原因,大多是因为传输数据或访问外部设备等带来的I/O操作或网络请求。这里的Waiting就是请求开始到响应之间需要等待的时间,就阻塞了。

一个典型的CPU处理数据的能力是硬盘或网络请求的好几个数量级,因此一个需要大的I/O操作的同步程序,需要花费大量的时间等待I/O操作或网络将数据准备好。这是因为这个原因,同步的程序就叫做阻塞的程序。

[3]操作系统模型中的进程变化状态

阻塞和非阻塞

阻塞与非阻塞的概念是针对IO状态而言的,

1
查看完整版本: Python异步编程和事件驱动