Skip to content
This repository has been archived by the owner on Dec 8, 2023. It is now read-only.

Latest commit

 

History

History
48 lines (21 loc) · 3.64 KB

Asyncio_1.md

File metadata and controls

48 lines (21 loc) · 3.64 KB

Python异步: 什么是异步编程? (1)

异步编程是一种不会阻塞的编程范式。相反,请求和函数调用会在未来某个时间以某种方式在后台发出和执行。这使调用者有时间执行其他活动,并在结果可用或调用者感兴趣时稍后处理发出的调用的结果。

1. 异步任务

异步意味着不同时,与同步或同时相反。在编程时,异步意味着请求动作,尽管在请求时并未执行。它稍后执行。这将发出进行函数调用的请求,而不会等待调用完成。我们可以选择稍后检查函数调用的状态或结果。

  • 异步函数调用:请求函数在某个时间以某种方式被调用,允许调用者恢复并执行其他活动。

函数调用将以某种方式在某个时间在后台发生,程序可以执行其他任务或响应其他事件。这是关键。我们无法控制请求的处理方式或时间,只是我们希望在程序执行其他操作时处理它。发出异步函数调用通常会产生一些请求句柄,调用者可以使用该句柄来检查调用状态或获取结果。这通常被称为"未来"。异步函数调用的句柄,允许检查调用状态和检索结果。

2. 异步编程

发出异步任务并进行异步函数调用称为异步编程。异步编程主要用于非阻塞 I/O,例如从与其他进程或其他系统的套接字连接读取和写入。非阻塞 I/O 是一种在请求读取和写入的情况下执行 I/O 的方式,尽管它是异步执行的。调用者不需要等待操作完成再返回。读取和写入操作以某种方式执行(例如,由底层操作系统或基于其构建的系统),并且操作和/或数据的状态稍后由调用者检索,一旦可用,或当调用者准备好时。

因此,我们可以看到非阻塞 I/O 与异步编程的关系。实际上,我们通过异步编程来使用非阻塞I/O,或者通过异步编程实现非阻塞I/O。非阻塞 I/O 与异步编程的结合是如此普遍,以至于它通常被简称为异步 I/O。

接下来,让我们考虑一下 Python 中的异步编程支持。

3. Python 中的异步编程

从广义上讲,Python 中的异步编程是指发出请求而不是阻塞等待它们完成。我们可以通过多种方式在 Python 中实现异步编程,尽管有一些与 Python 并发性相关。

3.1. asyncio

第一个例子是 asyncio 模块。该模块使用 async/await 语法和带套接字和子进程的非阻塞 I/O 直接提供异步编程环境。

它是使用在事件循环中运行的协程实现的,事件循环本身在单个线程中运行。更广泛地说,Python 提供了可以异步执行任务的线程和进程。

例如,一个线程可以启动第二个线程来执行函数调用并恢复其他活动。操作系统将在某个时间安排并执行第二个线程,而第一个线程可能会或可能不会手动检查任务的状态。

更具体地说,PythonThreadPoolExecutorProcessPoolExeuctor 类中提供了基于执行器的线程池和进程池。这些类使用相同的接口并通过返回 Future 对象的 submit() 方法支持异步任务。

3.2. multiprocessing

multiprocessing 模块还提供了使用 PoolThreadPool 类中的进程和线程的工作池,ThreadPoolExecutorProcessPoolExeuctor 类的前身。

这些类的功能是根据工作人员异步执行任务来描述的。它们显式地提供了用于执行任务的每种方法的同步(阻塞)和异步(非阻塞)版本。

例如,可以通过 apply() 方法同步或通过 apply_async() 方法异步发出一次性函数调用。