协程是什么一文弄懂使用场景
直接上代码#!/usr/bin/env python# -*- coding:utf-8 -*-# @author wzp# @date 2022/1/6# @file 家务事.py# @descriptionimport timeimport threadingdef 洗衣服(name):print("\n%s开始洗衣服" % name)print("1.准备脏衣服")print("2.打开洗衣
·
直接上代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @author wzp
# @date 2022/1/6
# @file 家务事.py
# @description
import time
import threading
def 洗衣服(name):
print("\n%s开始洗衣服" % name)
print("1.准备脏衣服")
print("2.打开洗衣机,放进脏衣服")
print("3.放洗衣液,关上门")
print("4.启动洗衣机,等待清洗完毕")
for i in range(0, 120,15):
time.sleep(1)
print("洗衣机正在运行..%s分钟"%i)
print("5.拿出洗好的衣服晾晒")
def 做饭(name):
print("\n%s开始做饭" % name)
print("1.淘米")
print("2.給电饭煲放水")
print("3.启动电饭煲,等待米饭煮好")
for i in range(0, 45,15):
time.sleep(1)
print("电饭煲正在煮饭..%s分钟" % i)
print("4.米饭煮好了")
def 扫地(name):
print("\n%s开始扫地" % name)
print("1.拿扫把扫地")
print("2.将扫出的垃圾放进垃圾桶")
print("3.下楼倒垃圾")
def 做家务():
name = '我'
洗衣服(name)
做饭(name)
扫地(name)
def 做家务多线程版():
a=threading.Thread(target=洗衣服,args=('爸爸',))
b=threading.Thread(target=做饭,args=('妈妈',))
c=threading.Thread(target=扫地,args=('我',))
a.start()
b.start()
c.start()
a.join()
b.join()
c.join()
if __name__ == '__main__':
start = time.time()
# 做家务多线程版()
做家务()
end = time.time()
print("做完家务事花费了%s" % (end - start))
大家运行一下多线程版和普通版,看看花费的时间
接下来看协程版
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @author wzp
# @date 2022/1/6
# @file 家务事协程版.py
# @description
import time
import asyncio
async def 洗衣服(name):
print("\n%s开始洗衣服" % name)
print("1.准备脏衣服")
print("2.打开洗衣机,放进脏衣服")
print("3.放洗衣液,关上门")
print("4.启动洗衣机,等待清洗完毕")
for i in range(0, 120,15):
result = await asyncio.sleep(1)
print("洗衣机正在运行..%s分钟"%i)
print("5.拿出洗好的衣服晾晒")
async def 做饭(name):
print("\n%s开始做饭" % name)
print("1.淘米")
print("2.給电饭煲放水")
print("3.启动电饭煲,等待米饭煮好")
for i in range(0, 45,15):
result = await asyncio.sleep(1)
print("电饭煲正在煮饭..%s分钟" % i)
print("4.米饭煮好了")
def 扫地(name):
print("\n%s开始扫地" % name)
print("1.拿扫把扫地")
print("2.将扫出的垃圾放进垃圾桶")
print("3.下楼倒垃圾")
def 做家务():
name = '我'
# 获取EventLoop:
loop = asyncio.get_event_loop()
# 需要等待的任务即IO密集型任务
tasks = [洗衣服(name), 做饭(name)]
# 开始处理
loop.run_until_complete(asyncio.wait(tasks))
扫地(name)
loop.close()
if __name__ == '__main__':
start = time.time()
做家务()
end = time.time()
print("做完家务事花费了%s" % (end - start))
很明显,多线程是多个线程执行不同的任务,协程是一个线程执行不同的任务,但是一个线程花费的时间却大大减少了,原因就在于协程会在你写了await
关键字的地方自己跳出去,执行另外一个任务,再在合适的时候自己跳回来继续执行。这样就减少了不必要的等待时间,提高了执行速度。
我们只需要在需要等待的方法前加async
关键字,在会产生IO的地方加上await
关键字,那么协程就会自己在合适的时候执行这个方法。
协程适合IO密集型程序,例如等待调用的返回结果,协程可以有非常非常多,避免了多线程的上下文切换,和死锁等问题
更多推荐
已为社区贡献1条内容
所有评论(0)