asyncio實現并發
我們可以使用asyncio來解決palywright中并發的問題,asyncio即Asynchronous I/O是python一個用來處理并發(concurrent)事件的包,是很多python異步架構的基礎,多用于處理高并發網絡請求方面的問題。給大家舉一個經典的應用場景就懂了,在不同的瀏覽器中同時執行打開百度首頁,獲取title的操作,代碼如下:
import asyncio
import time
from playwright.async_apiimport async_playwright
async def playwright_async_chromium():
? ? async with async_playwright() as p:
? ? ? ? browser = await p.chromium.launch(headless=False)
? ? ? ? page = await browser.new_page()
? ? ? ? await page.goto('http://baidu.com/')
? ? ? ? #await asyncio.sleep(2)
? ? ? ? print(await page.title())
? ? ? ? await asyncio.sleep(10)
? ? ? ? await browser.close()
async def playwright_async_firefox():
? ? async with async_playwright() as p:
? ? ? ? browser = await p.firefox.launch(headless=False)
? ? ? ? page = await browser.new_page()
? ? ? ? await page.goto('http://baidu.com/')
? ? ? ? #await asyncio.sleep(2)
? ? ? ? print(await page.title())
? ? ? ? await asyncio.sleep(10)
? ? ? ? await browser.close()
async def playwright_async_webkit():
? ? async with async_playwright() as p:
? ? ? ? browser = await p.webkit.launch(headless=False)
? ? ? ? page = await browser.new_page()
? ? ? ? await page.goto('http://baidu.com/')
? ? ? ? #await asyncio.sleep(2)
? ? ? ? print(await page.title())
? ? ? ? await asyncio.sleep(10)
? ? ? ? await browser.close()
#首先說明的是playwright中的并發操作需要對異步函數進行操作,因此定義了三個方法
async def playwright_async_chromium
async def playwright_async_firefox()
async def playwright_async_webkit()
接下來的代碼實現是關于asyncio異步運行函數的,大家參考下面的形式實現即可
#把這三個函數放入task是中
tasks = [playwright_async_chromium(),playwright_async_firefox(),playwright_async_webkit()] # tasks列表用于存放task
#事件循環event loop 是asyncio的核心,會運行異步任務和回調,執行網絡IO操作,運行子進程。使用get_event_loop()獲取當前事件循環。
loop = asyncio.get_event_loop()
startTime = time.time()
#執行tasks隊列中的函數,直到最晚的一個事件被處理完畢后結束
loop.run_until_complete(asyncio.wait(tasks))
#如果不在使用loop,建議使用關閉,類似操作文件的close()函數
loop.close()
endTime = time.time()
print("sum time: ",endTime-startTime)
代碼執行,顯示輸出22s左右
并發代碼優化
接下來我們可以優化一下代碼,同樣的操作在三個瀏覽器中運行沒必要寫三個函數,我們優化一下函數邏輯,直接上代碼:
async def playwright_async_browser(p_browser):
? ? async with async_playwright() as p:
? ? ? ? if p_browser.lower()=="webkit":
? ? ? ? ? browser = await p.webkit.launch(headless=False)
? ? ? ? elif p_browser.lower()=="firefox":
? ? ? ? ? browser = await p.firefox.launch(headless=False)
? ? ? ? else:
? ? ? ? ? browser = await p.chromium.launch(headless=False)
? ? ? ? page = await browser.new_page()
? ? ? ? await page.goto('http://baidu.com/')
? ? ? ? print(await page.title())
? ? ? ? await asyncio.sleep(10)
? ? ? ? await browser.close()
可以看到,實現思路很簡單,通過條件語句實現不同的參數輸入來啟動不同的瀏覽器,其他都不變,重新設置tasks即可,代碼如下:
tasks = [playwright_async_browser("webkit"),playwright_async_browser("Firefox"),playwright_async_browser("chromium")]
代碼執行,顯示輸出也是22s左右!
上面的代碼就是playwright 并發運行的實現思路,希望對大家有幫助!
我的每一篇文章都希望幫助讀者解決實際工作中遇到的問題!如果文章幫到了您,勞煩點贊、收藏、轉發!您的鼓勵是我不斷更新文章最大的動力!