国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python網絡爬蟲中的同步與異步示例詳解

2020-02-22 23:07:18
字體:
來源:轉載
供稿:網友

一、同步與異步

#同步編程(同一時間只能做一件事,做完了才能做下一件事情)<-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:

await表達式中的對象必須是awaitable requests不支持非阻塞 aiohttp是用于異步請求的庫

代碼

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)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 莆田市| 巫溪县| 渝北区| 兴仁县| 吕梁市| 廊坊市| 神木县| 虞城县| 思茅市| 临汾市| 都兰县| 平定县| 伊宁市| 香港 | 寿阳县| 滁州市| 治多县| 文山县| 罗甸县| 潮州市| 通化县| 灵璧县| 攀枝花市| 横山县| 大庆市| 平山县| 宁武县| 东山县| 融水| 横峰县| 龙陵县| 陇南市| 武川县| 阿拉善右旗| 灵宝市| 河津市| 绥芬河市| 兴山县| 洛隆县| 印江| 山东|