国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

詳解async 與 await,帶您理解Playwright使用異步方法的正確姿勢(shì)!

這篇具有很好參考價(jià)值的文章主要介紹了詳解async 與 await,帶您理解Playwright使用異步方法的正確姿勢(shì)!。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

async_playwright,自動(dòng)化測(cè)試,Playwright,python,測(cè)試工具

大家在使用python做playwright自動(dòng)化測(cè)試的過(guò)程中,一定會(huì)發(fā)現(xiàn)下面這種異步用法

async def func():
? ? ? await api
? ? ? await api

很多同學(xué)可能只是按照這種寫(xiě)法來(lái)編寫(xiě)項(xiàng)目的自動(dòng)化測(cè)試代碼,對(duì)于具體細(xì)節(jié)可能并不了解,今天我就來(lái)講一下playwright異步用法的相關(guān)技術(shù)細(xì)節(jié)。建議大家拷貝文檔中的腳本實(shí)際運(yùn)行一下,學(xué)習(xí)的效果會(huì)更好!

同步和異步的概念

同步:發(fā)送一個(gè)請(qǐng)求,等待返回,然后再發(fā)送下一個(gè)請(qǐng)求
異步:發(fā)送一個(gè)請(qǐng)求,不等待返回,隨時(shí)可以再發(fā)送下一個(gè)請(qǐng)求

async 與 await

python在3.5以后引入async和await來(lái)強(qiáng)化自身的異步編程,提升效率。async 是異步的簡(jiǎn)寫(xiě),而 await 可以認(rèn)為是 async wait 的簡(jiǎn)寫(xiě)。async 用于申明一個(gè) function 是異步的,而 await 用于等待一個(gè)異步方法執(zhí)行完成。異步函數(shù)的特點(diǎn)是能在函數(shù)執(zhí)行過(guò)程中掛起,去執(zhí)行其他異步函數(shù),等到掛起條件結(jié)束后再回來(lái)繼續(xù)執(zhí)行。await的作用是掛起函數(shù),等待函數(shù)操作完成,這時(shí)候回去執(zhí)行其他的異步函數(shù),而不是傻等,等掛起的執(zhí)行完成以后將會(huì)從其他異步函數(shù)處返回,執(zhí)行掛起結(jié)束的函數(shù)。await只可以對(duì)異步函數(shù)使用,普通函數(shù)使用會(huì)報(bào)錯(cuò)。await的本質(zhì)是通過(guò)yield from 實(shí)現(xiàn)的,關(guān)于yield生成器相關(guān)知識(shí)點(diǎn)這里就不詳細(xì)介紹了。

例如:兩個(gè)異步程序async a、async b:

a中一步有await,當(dāng)程序碰到關(guān)鍵字await后,異步程序a掛起,去執(zhí)行異步b程序(就相當(dāng)于從一個(gè)函數(shù)內(nèi)部跳出去執(zhí)行其他函數(shù));當(dāng)掛起條件結(jié)束時(shí)候,不管b是否執(zhí)行完,要馬上從b程序中跳出來(lái),回到原程序a執(zhí)行原來(lái)的操作;如果await后面跟的b函數(shù)不是異步函數(shù),那么操作就只能等b執(zhí)行完再返回,無(wú)法在b執(zhí)行的過(guò)程中返回,這樣就相當(dāng)于直接調(diào)用b函數(shù),沒(méi)必要使用await關(guān)鍵字了。因此,需要await后面跟的是異步函數(shù)。

舉個(gè)例子

import time
import asyncio
async def wait1():
    print('wait1 start')
    await asyncio.sleep(1)
    print('wait1 end')

async def wait3():
    print('wait3 start')
    await asyncio.sleep(3)
    print('wait3 end')

async def wait5():

    print('wait5 start')
    await asyncio.sleep(5)
    print('wait5 end')

# 2. 將異步函數(shù)加入事件隊(duì)列

tasks = [
    wait1(),
    wait3(),
    wait5(),
]

if __name__ == '__main__':

    # 創(chuàng)建一個(gè)事件循環(huán)
    loop = asyncio.get_event_loop()
    startTime = time.time()
    # 執(zhí)行隊(duì)列實(shí)踐,直到最晚的一個(gè)事件被處理完畢后結(jié)束
    loop.run_until_complete(asyncio.wait(tasks))
    # 如果不在使用loop,建議使用關(guān)閉,類似操作文件的close()函數(shù)
    loop.close()
    endTime = time.time()
    print("sum time: ",endTime-startTime)

運(yùn)行結(jié)果

wait5 start

wait3 start

wait1 start

wait1 end

wait3 end

wait5 end

sum time: 5.000609874725342

上面這段代碼大家可以多執(zhí)行幾次,我們會(huì)發(fā)現(xiàn):不管wait1 wait3,wait5 哪個(gè)函數(shù)先執(zhí)行,但是最后end的順序一定是 wait1>wait3>wait5。一共運(yùn)行的時(shí)間 在5s左右,充分地證明了三個(gè)函數(shù)是并行執(zhí)行的!

接下來(lái),我們可以對(duì)代碼進(jìn)行如下修改:

async def wait3():
    print('wait3 start')
    time.sleep(3)
    print('wait3 end')

然后再次運(yùn)行代碼,結(jié)果如下:

wait5 start

wait3 start

wait3 end

wait1 start

wait1 end

wait5 end

sum time: 5.002418518066406

大家會(huì)發(fā)現(xiàn),只有wait3 end 發(fā)生后,才會(huì)出現(xiàn)wait1 end 和wait5 end(),很好的證明了上面的話:如果await后面跟的b函數(shù)不是異步函數(shù),那么操作就只能等b執(zhí)行完再返回,無(wú)法在b執(zhí)行的過(guò)程中返回,這樣就相當(dāng)于直接調(diào)用b函數(shù),沒(méi)必要使用await關(guān)鍵字了。我們可以任意調(diào)整task的執(zhí)行順序,例如:

tasks = [
    wait1(),
    wait5(),
    wait3(),
]

執(zhí)行最慢的情況就是,wait3 第一個(gè)start,等待wait3 end后,才能執(zhí)行wait1 或者wait5

wait3 start

wait3 end

wait5 start

wait1 start

wait1 end

wait5 end

sum time: 8.000799894332886

一個(gè)易犯的錯(cuò)誤

當(dāng)我們?cè)谕椒椒ㄖ屑尤隺wait,執(zhí)行代碼的時(shí)候會(huì)報(bào)錯(cuò),也就是說(shuō)像下面這樣編寫(xiě)playwright腳步是不對(duì)的,因?yàn)閟ync_playwright() 是同步方法!

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
 browser = p.chromium.launch(channel="chrome")
 page = browser.new_page()
 await page.goto("http://www.baidu.com")
 print(page.title())
 browser.close()

Playwright使用異步方法的正確姿勢(shì)

如下代碼會(huì)正常運(yùn)行,通過(guò)await可以保證腳本的運(yùn)行順序

async def playwright_async_demo():
  async with async_playwright() as p:
     browser = await p.chromium.launch(channel="chrome")
     page = await browser.new_page()
     await page.goto("http://www.baidu.com")
asyncio.run(playwright_async_demo())

如果我們把上面代碼中 browser = await p.chromium.launch(channel="chrome")
的await關(guān)鍵字去掉就會(huì)報(bào)錯(cuò)

page = await browser.new_page()

AttributeError: 'coroutine' object has no attribute 'new_page'

sys:1: RuntimeWarning: coroutine 'BrowserType.launch' was never awaited

原因就是代碼行 browser = p.chromium.launch(channel="chrome")還沒(méi)執(zhí)行完就執(zhí)行了下一行 page = await browser.new_page()

最后的總結(jié),如果大家需要并行執(zhí)行用例,那么需要考慮async (這里建議基于場(chǎng)景設(shè)計(jì)),如果沒(méi)有這個(gè)需求,這部分只是點(diǎn)做為了解即可。

我的每一篇文章都希望幫助讀者解決實(shí)際工作中遇到的問(wèn)題!如果文章幫到了您,勞煩點(diǎn)贊、收藏、轉(zhuǎn)發(fā)!您的鼓勵(lì)是我不斷更新文章最大的動(dòng)力!

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-656832.html

到了這里,關(guān)于詳解async 與 await,帶您理解Playwright使用異步方法的正確姿勢(shì)!的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 微信小程序——異步請(qǐng)求使用async/await實(shí)現(xiàn)同步

    微信小程序——異步請(qǐng)求使用async/await實(shí)現(xiàn)同步

    ????????在小程序的開(kāi)發(fā)中,我們知道網(wǎng)絡(luò)請(qǐng)求wx.requset是一個(gè)異步請(qǐng)求的API,當(dāng)我們使用它時(shí),會(huì)出現(xiàn)請(qǐng)求還沒(méi)有結(jié)束,我們下面寫(xiě)的處理數(shù)據(jù)的代碼就已經(jīng)執(zhí)行了從而導(dǎo)致了我們寫(xiě)的程序出現(xiàn)問(wèn)題,那么我們?cè)撛趺唇鉀Q這個(gè)問(wèn)題呢?今天我們用async/await來(lái)實(shí)現(xiàn)一下吧。

    2024年02月11日
    瀏覽(26)
  • 前端(十二)——深入理解和使用 async和await

    前端(十二)——深入理解和使用 async和await

    ??博主:小貓娃來(lái)啦 ??文章核心: 深入理解和使用 async和await 在 JS中,異步操作是無(wú)法避免的,而處理異步操作最常用的方法是使用回調(diào)函數(shù)或者 Promise 。然而,自 ES2017 引入了 async/await 之后,我們可以通過(guò)更簡(jiǎn)潔、可讀性更好的方式來(lái)處理異步代碼。本文將從淺層次到深

    2024年02月12日
    瀏覽(19)
  • 什么是Promise對(duì)象?它的狀態(tài)有哪些?如何使用Promise處理異步操作?以及 async、await

    什么是Promise對(duì)象?它的狀態(tài)有哪些?如何使用Promise處理異步操作?以及 async、await

    前端入門(mén)之旅:探索Web開(kāi)發(fā)的奇妙世界 記得點(diǎn)擊上方或者右側(cè)鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來(lái)到前端入門(mén)之旅!這個(gè)專欄是為那些對(duì)Web開(kāi)發(fā)感興趣、剛剛踏入前端領(lǐng)域的朋友們量身打造的。無(wú)論你是完全的新手還是有一些基礎(chǔ)的開(kāi)發(fā)者,這里都將為你提供一

    2024年02月11日
    瀏覽(52)
  • Unity中的異步編程【5】——在Unity中使用 C#原生的異步(Task,await,async) - System.Threading.Tasks

    Unity中的異步編程【5】——在Unity中使用 C#原生的異步(Task,await,async) - System.Threading.Tasks

    1、System.Threading.Tasks中的Task是.Net原生的異步和多線程包。 2、UniTask(Cysharp.Threading.Tasks)是仿照.Net原生的Task,await,async開(kāi)發(fā)的一個(gè)包,該包專門(mén)服務(wù)于Unity,所以取名UnityTask,簡(jiǎn)稱UniTask。 3、既然有Task了,為啥還要搞一個(gè)UniTask (1)Task可以用在PC和Android上,但是在WebGL上則會(huì)

    2023年04月17日
    瀏覽(25)
  • promise及異步編程async await

    promise及異步編程async await

    ECMAScript 6 新增了正式的 Promise(期約)引用類型,支持優(yōu)雅地定義和組織異步邏輯。接下來(lái)幾個(gè)版本增加了使用 async 和 await 定義異步函數(shù)的機(jī)制 JavaScript 是單線程事件循環(huán)模型。異步行為是為了優(yōu)化因計(jì)算量大而時(shí)間長(zhǎng)的操作,只要你不想為等待某個(gè)異步操作而阻塞

    2024年02月04日
    瀏覽(24)
  • 【前端】淺談async/await異步傳染性

    【前端】淺談async/await異步傳染性

    \\\"異步傳染性\\\"問(wèn)題通常是指,當(dāng)一個(gè)函數(shù)使用了async和await,其調(diào)用者也需要使用async和await處理異步操作,導(dǎo)致整個(gè)調(diào)用鏈都變成異步的。這種情況可能導(dǎo)致代碼變得更復(fù)雜,不易維護(hù)。 類似于C# try catch的層層上拋,在某一層catch 查了很多資料 ,對(duì)于這個(gè)問(wèn)題說(shuō)法還都不一樣

    2024年01月23日
    瀏覽(21)
  • HarmonyOS通過(guò)async與await同異步轉(zhuǎn)換 解決異步回調(diào)地獄

    HarmonyOS通過(guò)async與await同異步轉(zhuǎn)換 解決異步回調(diào)地獄

    我在 HarmonyOS 發(fā)送http網(wǎng)絡(luò)請(qǐng)求 中講述了 HTTP請(qǐng)求的基本方式 然后 就帶出了 回調(diào)地獄的問(wèn)題 然后 上文 HarmonyOS 通過(guò)Promise 解決異步回調(diào)地獄問(wèn)題 我們用Promise的解決方案 搞定了 這個(gè)問(wèn)題 但是 Promise 這種寫(xiě)法 可讀性其實(shí)沒(méi)有那么優(yōu)秀 沒(méi)有搞定 Promise return規(guī)則的人甚至都看不懂

    2024年01月24日
    瀏覽(27)
  • uniapp _微信小程序使用async,await(易如反掌的理解清楚)

    async 和 await 是 JavaScript 中處理異步編程的一種方式,它們是 ECMAScript 2017(也被稱為 ES8)引入的新特性。 async 用于聲明一個(gè)函數(shù)是異步函數(shù)。異步函數(shù)在執(zhí)行時(shí)返回一個(gè) Promise 對(duì)象。它使得在函數(shù)內(nèi)部可以使用 await 等待異步操作的完成。 await 只能在 as

    2024年03月15日
    瀏覽(24)
  • 消滅異步回調(diào),還得是 async-await

    關(guān)于異步處理問(wèn)題,ES5的回調(diào)讓我們陷入回調(diào)地獄輪回,后來(lái)ES6的Promise(Promise不了解?點(diǎn)這了解[1])讓我們脫離輪回,終于,ES7的async-await帶我們走向光明。今天我們就來(lái)學(xué)習(xí)一夏 async-await,看看與Promise有何聯(lián)系和區(qū)別。 一、走進(jìn)Async-await原理 1、原理1 async函數(shù)返回一個(gè)

    2024年02月10日
    瀏覽(24)
  • 深入理解Spring的@Async注解:實(shí)現(xiàn)異步方法調(diào)用

    在當(dāng)今高速發(fā)展的應(yīng)用開(kāi)發(fā)領(lǐng)域,對(duì)于提升系統(tǒng)性能和響應(yīng)能力的需求越來(lái)越迫切。而異步編程作為一種解決方案,已經(jīng)成為現(xiàn)代應(yīng)用開(kāi)發(fā)中的一項(xiàng)重要技術(shù)。本篇博客將帶您深入探究 Java 中的 @Async 注解,揭示其強(qiáng)大的異步執(zhí)行能力和精妙的實(shí)現(xiàn)機(jī)制。 異步編程是一種編程

    2024年02月05日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包