当前位置:网站首页 > 技术博客 > 正文

asyncio yield



廖雪峰
资深软件开发工程师,业余马拉松选手。


是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。

的编程模型就是一个消息循环。模块内部实现了,把需要执行的协程扔到中执行,就实现了异步IO。

用提供的可以把一个标记为类型,然后在内部用调用另一个实现异步操作。

为了简化并更好地标识异步IO,从Python 3.5开始引入了新的语法和,可以让的代码更简洁易读。

用实现代码如下:

把一个函数变成类型,然后,我们就把这个函数扔到中执行。执行结果如下:

会首先打印出,然后,语法可以让我们方便地调用另一个函数。由于也是一个函数,所以线程不会等待,而是直接中断并执行下一个消息循环。当返回时,就接着执行下一行语句。

把看成是一个耗时1秒的IO操作,在此期间,主线程并未等待,而是去执行中其他可以执行的函数了,因此可以实现并发执行。

上述还没有看出并发执行的特点,我们改写一下,让两个同时并发执行:

用同时调度多个函数:

执行结果如下:

从结果可知,用执行函数,所有函数均由同一个线程执行。两个是并发执行的,并且可以拿到函数执行的结果(即的返回值)。

如果把换成真正的IO操作,则多个并发的IO操作实际上可以由一个线程并发执行。

我们用的异步网络连接来获取sina、sohu和163的网站首页:

执行结果如下:

可见3个连接由一个线程并发执行3个函数完成。

提供了完善的异步IO支持,用调度一个;

在一个函数内部,通过可以调用另一个函数,这个调用看起来是串行执行的,但实际上是由内部的消息循环控制;

在一个函数内部,通过可以并发执行若干个函数。

hello.py

gather.py

wget.py

版权声明


相关文章:

  • elbow load2025-10-10 15:01:01
  • gif制作软件app免费2025-10-10 15:01:01
  • 线程安全的含义2025-10-10 15:01:01
  • 指标体系包括什么2025-10-10 15:01:01
  • c语言以eof结束2025-10-10 15:01:01
  • 晶振的并联电容和负载电容2025-10-10 15:01:01
  • url转发域名可以带端口吗2025-10-10 15:01:01
  • 召回率(【机器学习】一文读懂准确率、精确率、召回率、F1分数、ROC-AUC都是什么)2025-10-10 15:01:01
  • 使用malloc动态分配存储空间2025-10-10 15:01:01
  • ibm aix小型机2025-10-10 15:01:01