python對非同步程式設計有原生的支援,即asyncio標準庫,使用非同步io模型可以節約大量的io等待時間,非常適合於爬蟲任務。
import time
import asyncio
import aiohttp # 用非同步方式獲取網頁內容
loop = asyncio.get_event_loop() # 獲取事件迴圈
sem = asyncio.semaphore(10) # 控制併發的數量
tasks = [get_html(url, sem) for url in urls] # 把所有任務放到乙個列表中
loop.run_until_complete(asyncio.wait(tasks)) # 啟用協程
loop.close() # 關閉事件迴圈
if __name__ == '__main__':
start = time.time()
main()
print(time.time()-start) # 5.03s
如果想進一步加快爬取速度,考慮到python多執行緒的全域性鎖限制,可以採用多程序+協程的方案:
import time
import asyncio
import aiohttp # 用非同步方式獲取網頁內容
loop = asyncio.get_event_loop() # 獲取事件迴圈
sem = asyncio.semaphore(10) # 控制併發的數量
tasks = [get_html(url, sem) for url in urls] # 把所有任務放到乙個列表中
loop.run_until_complete(asyncio.wait(tasks)) # 啟用協程
loop.close() # 關閉事件迴圈
if __name__ == '__main__':
start = time.time()
p = pool(4)
for i in range(4):
p.close()
p.join()
print(time.time()-start) # 2.87s
可以看出來多程序已經加快了爬取速度,具體加速效果跟機器cpu配置相關。 spring 非同步處理 Async
最近剛要用到非同步處理小結一下 非同步執行 所謂非同步,就是當執行a方法的過程中呼叫b方法,但是b方法並不影響a方法的執行效率,即使b方法沒有執行結束還是會正常執行a方法。簡單說非同步執行就是先返回結果,再執行過程 或者 當執行a方法的過程中,只用滿足某個條件是才會執行b方法,但是b方法的成功和失敗...
Async非同步呼叫
1.專案啟動類上加 enableasync enableasync 允許非同步 public static void main string args 2.無返回值情況 在需要執行的非同步方法上加 async component public class asynctask catch interr...
SpringBoot實現 Async非同步
需要在啟動類加上 enableasync註解 呼叫service的話,把 async註解放到service實現類上。增加 async註解。在這裡要特殊注意返回futrue。如果需要返回結果只能用future。controller呼叫 isdone表示執行成功。這裡的while沒用。如果不是呼叫ser...