异步协程模拟

import time

# def func():
#     print("我爱凋零")
#     time.sleep(3)   #让当前线程处于阻塞状态,cpu不为你工作
#     print("我爱流云")
#
# if __name__ == '__main__':
#     func()

#input()程序处于阻塞状态
#requests.get()在网络请求返回数据前,程序也是处于阻塞状态
#一般情况下,程序处于IO操作的时候,程序处于阻塞状态


#协程:当程序遇见IO的时候,可以处理其他任务上
#在微观上是任务之间的切换
#宏观上是,多个任务在一起执行,这就是
#多任务异步操作

#这些都是单线程资源

#python编写协程的程序
# import asyncio
# async def func():
#     print("你好")
#
#
# if __name__ == '__main__':
#     g=func() #此时的函数是异步协程函数,执行结果得到的是一个异步协程对象
#     print(g)
#     asyncio.run(g) #协程程序运行需要asyncio模块的支持
##########################################################################
# import asyncio
# import time
# async def func1():
#     print("你好我叫凋零1")
#     #time.sleep(3)  #当程序出现同步操作时候,异步就中断了 requests.get()和time都是
#     await asyncio.sleep(3)  # 异步操作代码
#     print("你好我叫凋零2")
#
# async def func2():
#     print("你好我叫流云1")
#     #time.sleep(2)
#     await asyncio.sleep(2)
#     print("你好我叫流云2")
#
# async def func3():
#     print("你好我叫123")
#     #time.sleep(4)
#     await asyncio.sleep(4)
#     print("你好我叫456")
#
# if __name__ == '__main__':
#     f1=func1()
#     f2=func2()
#     f3=func3()
#     tasks=[f1,f2,f3]
#     t1=time.time()
#     #一次性启动多个任务(协程)
#     asyncio.run(asyncio.wait(tasks))  #同步操作
#     t2=time.time()
#     print(t2-t1)

##################################推荐写法########
# import asyncio
# import time
# async def func1():
#     print("你好我叫凋零1")
#     #time.sleep(3)  #当程序出现同步操作时候,异步就中断了 requests.get()和time都是
#     await asyncio.sleep(3)  # 异步操作代码
#     print("你好我叫凋零2")
#
# async def func2():
#     print("你好我叫流云1")
#     #time.sleep(2)
#     await asyncio.sleep(2)
#     print("你好我叫流云2")
#
# async def func3():
#     print("你好我叫123")
#     #time.sleep(4)
#     await asyncio.sleep(4)
#     print("你好我叫456")
#
# async def main():
#     #第一种写法
#     # f1=func1()
#     # await f1 #一般wait挂起操作放在协程对象前面
#     #第二种写法
#     tasks=[
#         func1(),func2(),func3()
#     ]
#     await asyncio.wait(tasks)
#
#
# if __name__ == '__main__':
#     asyncio.run(main())
#     t1=time.time()
#     #一次性启动多个任务(协程)
#     asyncio.run(main())  #同步操作
#     t2=time.time()
#     print(t2-t1)
##########################################################
#在爬虫领域的应用

import asyncio
import time
async def download(url):
    print("开始准备下载")
    await asyncio.sleep(2)#模拟网络请求不能是requests.get
    print("下载完成")

async def main():
    urls=["https://www.bilibili.com",
          "https://www.baidu.com",
          "https://www.163.com"]
    tasks=[]
    for url in urls:
        d=download(url)
        tasks.append(d)
    await asyncio.wait(tasks)
if __name__ == '__main__':
    asyncio.run(main())

 

posted @ 2022-05-07 16:38  凋零_(  阅读(22)  评论(0编辑  收藏  举报