一、同步與異步
#同步編程(同一時間只能做一件事,做完了才能做下一件事情)<-a_url-><-b_url-><-c_url->#異步編程 (可以近似的理解成同一時間有多個事情在做,但有先后)<-a_url-> <-b_url-> <-c_url-> <-d_url-> <-e_url-> <-f_url-> <-g_url-> <-h_url-> <--i_url--> <--j_url-->
模板
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) for url in urls])#下面兩行都是套路,記住就好loop = asyncio.get_event_loop()loop.run_until_complete(fast_do_your_thing())
tips:
代碼
import asyncioimport requestsimport timeimport aiohttpurls = ['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 with aiohttp.ClientSession() as session: async with session.get(url) as resp: print(resp.status) print("{url} 得到響應".format(url=url))async def fast_requsts(urls): start = time.time() await asyncio.wait([requests_meantime_dont_wait(url) for url in urls]) 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能夠修改標準庫里面大部分的阻塞式系統調用。這樣在不改變原有代碼的情況下,將應用的阻塞式方法,變成協程式的(異步)。
代碼
from gevent import monkeyimport geventimport requestsimport timemonkey.patch_all()def req(url): print(url) resp = requests.get(url) print(resp.status_code,url)def synchronous_times(urls): """同步請求運行時間""" start = time.time() for url in urls: req(url) end = time.time() print('同步執行時間 {} s'.format(end-start))def asynchronous_times(urls): """異步請求運行時間""" start = time.time() gevent.joinall([gevent.spawn(req,url) for url in urls]) end = time.time() print('異步執行時間 {} s'.format(end - start))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/經濟學']synchronous_times(urls)asynchronous_times(urls)
新聞熱點
疑難解答