一、同步与异步
#同步编程(同一时间只能做一件事,做完了才能做下一件事情)
#异步编程 (可以近似的理解成同一时间有多个事情在做,但有先后)
模板
import asyncio
#函数名:做现在的任务时不等待,能继续做别的任务。
async def donow_meantime_dontwait(url):
response = await requests.get(url)
#函数名:快速高效的做任务
async def fast_do_your_thing():
await asyncio.wait([donow_meantime_dontwait(url) forurlinurls])
#下面两行都是套路,记住就好
loop = asyncio.get_event_loop()
loop.run_until_complete(fast_do_your_thing())
tips:
await表达式中的对象必须是awaitable
requests不支持非阻塞
aiohttp是用于异步请求的库
代码
import asyncio
import requests
import time
import aiohttp
urls = ['https://book.douban.com/tag/小说','https://book.douban.com/tag/科幻',
'https://book.douban.com/tag/漫画','https://book.douban.com/tag/奇幻',
'https://book.douban.com/tag/历史','https://book.douban.com/tag/经济学']
async def requests_meantime_dont_wait(url):
print(url)
async withaiohttp.ClientSession()assession:
async withsession.get(url)asresp:
print(resp.status)
print("{url} 得到响应".format(url=url))
async def fast_requsts(urls):
start = time.time()
await asyncio.wait([requests_meantime_dont_wait(url) forurlinurls])
end=time.time()
print("Complete in {} seconds".format(end- start))
loop = asyncio.get_event_loop()
loop.run_until_complete(fast_requsts(urls))
gevent简介
gevent是一个python的并发库,它为各种并发和网络相关的任务提供了整洁的API。
gevent中用到的主要模式是greenlet,它是以C扩展模块形式接入Python的轻量级协程。 greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。
猴子补丁
requests库是阻塞式的,为了将requests同步更改为异步。只有将requests库阻塞式更改为非阻塞,异步操作才能实现。
而gevent库中的猴子补丁(monkey patch),gevent能够修改标准库里面大部分的阻塞式系统调用。这样在不改变原有代码的情况下,将应用的阻塞式方法,变成协程式的(异步)。
代码
fromgevent import monkey
import gevent
import reques