python非同步框架asyncio的使用

2022-08-05 09:00:16 字數 1855 閱讀 2086

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...