关于Python异步协程中for循环的使用
本文转载自简书:https://www.jianshu.com/p/c321eb22cffd
用户:简单书写_,
Python使用异步模块Asyncio实现多线程并发,一般方式是:
async def func():
# code...
async def main():
await(func())
if __name__ =='__main__':
asyncio.run(main())
但实验过程中有个需求,是让循环体的每次循环都作为一个并发线程产生并发。
这种情况下,每次循环使用await调用异步函数,无法实现需求中的并发需求。
asyncio程序如下:
import time
import asyncio
async def hello():
await asyncio.sleep(1)
print('Hello World:%s' % time.time())
async def main():
start = time.time()
for i in range(5):
await(hello())
print("use time: %f s" % (time.time()-start))
if __name__ =='__main__':
asyncio.run(main())
程序结果:
Hello World:1608368438.992576
Hello World:1608368439.9939594
Hello World:1608368440.9950461
Hello World:1608368441.9971309
Hello World:1608368443.00034
use time: 5.008629 s
程序运行时间是5秒,意味着并未达到异步的效果。
原因:整个for循环体是一个协程,协程切换时会挂起整个main协程。
解决办法:使用asyncio.gather()
asyncio.gather()需要输入一个任务列表,gather会划分任务,并分组执行,因此可以应对for循环体内的异步。
完善后的代码:
import time
import asyncio
async def hello():
await asyncio.sleep(1)
print('Hello World:%s' % time.time())
async def main():
tasks=[]
for i in range(5):
tasks.append(hello())
await asyncio.gather(*tasks)
if __name__ =='__main__':
asyncio.run(main())
程序运行结果:
Hello World:1608368546.8756351
Hello World:1608368546.8756351
Hello World:1608368546.8756351
Hello World:1608368546.8756351
Hello World:1608368546.8756351
use time: 1.002837 s
程序运行时间是1秒,说明已经达到异步效果。
参考:
关于Python异步协程中for循环的使用的更多相关文章
- Python异步协程(asyncio详解)
续上篇讲解yield from博客,上篇链接:https://www.cnblogs.com/Red-Sun/p/16889182.html PS:本博客是个人笔记分享,不需要扫码加群或必须关注什么的 ...
- 结合Thread Ninja明确与处理异步协程中的异常
Thread Ninja说明: Thread Ninja - Multithread Coroutine Requires Unity 3.4.0 or higher. A simple script ...
- python 异步协程
"""A very simple co-routine scheduler. Note: this is written to favour simple code ov ...
- python爬虫---单线程+多任务的异步协程,selenium爬虫模块的使用
python爬虫---单线程+多任务的异步协程,selenium爬虫模块的使用 一丶单线程+多任务的异步协程 特殊函数 # 如果一个函数的定义被async修饰后,则该函数就是一个特殊的函数 async ...
- Python中异步协程的使用方法介绍
1. 前言 在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞.比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,程序一直在等待网站响应,最后 ...
- 异步IO(协程,消息循环队列)
同步是CPU自己主动查看IO操作是否完成,异步是IO操作完成后发出信号通知CPU(CPU是被通知的) 阻塞与非阻塞的区别在于发起IO操作之后,CPU是等待IO操作完成再进行下一步操作,还是不等待去做其 ...
- Python 协程与事件循环
Table of Contents 前言 协程 async & await 事件循环 asyncio 的事件循环 结语 参考链接 前言 Python 标准库 asyncio 是我目前接触过的最 ...
- python协程与异步协程
在前面几个博客中我们一一对应解决了消费者消费的速度跟不上生产者,浪费我们大量的时间去等待的问题,在这里,针对业务逻辑比较耗时间的问题,我们还有除了多进程之外更优的解决方式,那就是协程和异步协程.在引入 ...
- Python爬虫进阶 | 异步协程
一.背景 之前爬虫使用的是requests+多线程/多进程,后来随着前几天的深入了解,才发现,对于爬虫来说,真正的瓶颈并不是CPU的处理速度,而是对于网页抓取时候的往返时间,因为如果采用request ...
- {python之协程}一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二
python之协程 阅读目录 一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二 一 引子 本 ...
随机推荐
- MQ异常断开
ActiveMQ:No operations allowed after statement closed问题及解决办法 ActiveMQ版本:5.5.1 现象: 系统现象:部分消息发送失败,失败 ...
- 微信小程序中如何上传图片来识别身份证银行卡?
Page({ shibie2(){ //识别银行卡 var that=this wx.chooseImage({ //选择图片 count: 1, //上传数量 sizeType: ['origina ...
- STM32的USART的DMA不定长度收发代码
/* * 函数名:USART1_DMA_Config * 描述 :串口1的DMA 的初始化配置 * 输入 :无 * 输出 : 无 * 调用 :在USART1_INIT()中被调用 */ voi ...
- RTC 科普视频丨聊聊空间音频的原理与其背后的声学原理
在现在很多的线上实时互动场景中,我们重视的不仅仅是互动体验,还要提升沉浸感.而在很多场景中,仅凭空间音频技术,就可以带来如临其境的体验.空间音频技术的原理是怎样的呢? 看过我们新一期的 RTC 科普视 ...
- Django-5
Django-5 1.Coookie 1.1 什么是cookie Cookie是储存在浏览器端的一小段文本数据(键值对). 被广泛用于在网站之间传输信息, 当您访问一个网站时,它会将一个Cookie发 ...
- 一文学会Flex布局
参考: <CSS权威指南>(第四版) flex布局教程-语法篇-阮一峰 1.Flex布局是什么 FlexBox,弹性盒布局,顾名思义,就是元素具有弹性,能根据可用空间大小增减尺寸. 2.基 ...
- mybatis-spring注解MapperScan的原理
很多开发者应该都知道,我们只使用@MapperScan这个注解就可以把我们写的Mybatis的Mapper接口加载到Spring的容器中,不需要对每个Mapper接口加@Mapper这个注解了,加快了 ...
- Solon Initializr v1.2 发布
Solon Initializr 是 Solon 框架的模板生成器项目.本期更新增加了快捷组合包的依赖选择,并生成对应的项目模板. 更新说明 增加 Solon Lib 依赖选择,并生成对应项目 增加 ...
- odoo 开发入门教程系列-一些用户界面
一些用户界面 数据文件 (XML) 参考: 该主题关联文档可以查看Data Files. 上一章,我们通过CSV文件添加了数据.当需要添加数据格式简单时,用CSV格式还是很方便的,当数据格式更复杂时( ...
- ColorWell - web 颜色代码取色工具,Mac 上的优秀调色板
ColorWell 是 Mac 上的一款非常优秀的颜色取色工具,她具有历史记录.调色板同步等功能,非常适合 web 或 App 开发人员使用 下载 ► ColorWell 下载安装 ⇲ 详细介绍 美丽 ...