首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python 协程实现异步(修正版)

Python 协程实现异步(修正版)

作者头像
Wu_Candy
发布2022-07-04 20:12:16
发布2022-07-04 20:12:16
48400
代码可运行
举报
文章被收录于专栏:无量测试之道无量测试之道
运行总次数:0
代码可运行
这是无量测试之道的第161篇原创

今日主题:前面分享过Python 通过使用回调函数如何实现异步的处理,今天我们将通过一个简单的示例来讲解一下协程是如何实现异步的处理的。

协程的概念 协程,又称微线程,是一种用户态的轻量级线程。协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置,当程序中存在大量不需要CPU的操作时(IO),适用于协程。

协程的优势 协程有极高的执行效率,因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销。

不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

因为协程是一个线程执行,所以想要利用多核CPU,最简单的方法是多进程+协程,这样既充分利用多核,又充分发挥协程的高效率。

构成协程的条件

  • 必须在只有一个单线程里实现并发
  • 修改共享数据不需加锁
  • 用户程序里自己保存多个控制流的上下文栈
  • 一个协程遇到IO操作自动切换到其它协程

Python 使用协程实现异步

代码语言:javascript
代码运行次数:0
运行
复制
 1import threading
 2import time
 3import datetime
 4
 5#第一个请求
 6def request_1():
 7    print("the request 1 is start")
 8    data=yield io()#定义一个协程处理
 9    print("the response of callback is:",data)
10   print("the request 1 is end")
11
12#第二个请求
13def request_2():
14    print("the request 2 is start")
15    time.sleep(2)#定义耗时2s
16    print("the request 2 is end")
17
18#获取数据请求类的操作,如:从db读取数据,循环耗时,调用其他api等
19def io():
20    def run():
21        print("the run is start")
22        time.sleep(5)#定义耗时5s
23        print("the run is end")
24        conn_db=[x for x in range(10000)] #模拟从db获取数据
25        try:
26            global gen
27            gen.send(conn_db) #线程结束时发送数据给request_1函数里面的data=yeild io(),此时request_1被唤醒继续处理
28        except StopIteration as e:
29            print(e)
30    # 这里是启动一个线程去处理这个io操作,不用阻塞程序的处理,即不影响requst_2的继续处理
31    threading.Thread(target=run,).start()
32
33if __name__ == '__main__':
34    start_time=datetime.datetime.now()
35    global gen
36    gen=request_1() #函数的赋值操作,生成一个生成器
37    next(gen)#调用next函数,预激协程,执行了request_1()函数,如果io被挂起,就直接执行request_2()
38    request_2()
39    end_time=datetime.datetime.now()
40    #这里是在统计总耗时,从打印的结果可以看到是异步处理的。
41    print("the spend of total time is:",(end_time-start_time).seconds)

程序运行后的输出是:

代码语言:javascript
代码运行次数:0
运行
复制
1the request 1 is start
2the run is start
3the request 2 is start
4the request 2 is end
5the spend of total time is: 2
6the run is end
7the response of callback is: [0, 1,...9999]
8the request 1 is end
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 无量测试之道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 这是无量测试之道的第161篇原创
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档