直接上代码

#!/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密集型程序,例如等待调用的返回结果,协程可以有非常非常多,避免了多线程的上下文切换,和死锁等问题

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐