国产探花免费观看_亚洲丰满少妇自慰呻吟_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)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 三台县| 印江| 凯里市| 永和县| 盐山县| 梅州市| 孙吴县| 仪陇县| 孟村| 吉安县| 泰来县| 福安市| 天津市| 孝昌县| 襄樊市| 溧水县| 施秉县| 通道| 鸡泽县| 饶河县| 旌德县| 天全县| 顺平县| 东阳市| 盐城市| 左权县| 金溪县| 丹阳市| 蒲江县| 溆浦县| 洞口县| 闽侯县| 库车县| 澎湖县| 睢宁县| 鸡西市| 惠安县| 镇赉县| 朝阳区| 营山县| 襄城县|