异步编程是一种不会阻塞的编程范式。相反,请求和函数调用会在未来某个时间以某种方式在后台发出和执行。这使调用者有时间执行其他活动,并在结果可用或调用者感兴趣时稍后处理发出的调用的结果。
异步意味着不同时,与同步或同时相反。在编程时,异步意味着请求动作,尽管在请求时并未执行。它稍后执行。这将发出进行函数调用的请求,而不会等待调用完成。我们可以选择稍后检查函数调用的状态或结果。
函数调用将以某种方式在某个时间在后台发生,程序可以执行其他任务或响应其他事件。这是关键。我们无法控制请求的处理方式或时间,只是我们希望在程序执行其他操作时处理它。发出异步函数调用通常会产生一些请求句柄,调用者可以使用该句柄来检查调用状态或获取结果。这通常被称为"未来"。异步函数调用的句柄,允许检查调用状态和检索结果。
发出异步任务并进行异步函数调用称为异步编程。异步编程主要用于非阻塞 I/O,例如从与其他进程或其他系统的套接字连接读取和写入。非阻塞 I/O 是一种在请求读取和写入的情况下执行 I/O 的方式,尽管它是异步执行的。调用者不需要等待操作完成再返回。读取和写入操作以某种方式执行(例如,由底层操作系统或基于其构建的系统),并且操作和/或数据的状态稍后由调用者检索,一旦可用,或当调用者准备好时。
因此,我们可以看到非阻塞 I/O 与异步编程的关系。实际上,我们通过异步编程来使用非阻塞I/O,或者通过异步编程实现非阻塞I/O。非阻塞 I/O 与异步编程的结合是如此普遍,以至于它通常被简称为异步 I/O。
接下来,让我们考虑一下 Python 中的异步编程支持。
从广义上讲,Python
中的异步编程是指发出请求而不是阻塞等待它们完成。我们可以通过多种方式在 Python
中实现异步编程,尽管有一些与 Python 并发性相关。
第一个例子是 asyncio
模块。该模块使用 async/await
语法和带套接字和子进程的非阻塞 I/O 直接提供异步编程环境。
它是使用在事件循环中运行的协程实现的,事件循环本身在单个线程中运行。更广泛地说,Python
提供了可以异步执行任务的线程和进程。
例如,一个线程可以启动第二个线程来执行函数调用并恢复其他活动。操作系统将在某个时间安排并执行第二个线程,而第一个线程可能会或可能不会手动检查任务的状态。
更具体地说,Python
在 ThreadPoolExecutor
和 ProcessPoolExeuctor
类中提供了基于执行器的线程池和进程池。这些类使用相同的接口并通过返回 Future
对象的 submit()
方法支持异步任务。
multiprocessing
模块还提供了使用 Pool
和 ThreadPool
类中的进程和线程的工作池,ThreadPoolExecutor
和 ProcessPoolExeuctor
类的前身。
这些类的功能是根据工作人员异步执行任务来描述的。它们显式地提供了用于执行任务的每种方法的同步(阻塞)和异步(非阻塞)版本。
例如,可以通过 apply()
方法同步或通过 apply_async()
方法异步发出一次性函数调用。