异步协程模拟
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())