亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python異步與JavaScript原生異步有什么區別

發布時間:2022-04-26 14:29:40 來源:億速云 閱讀:128 作者:iii 欄目:大數據

今天小編給大家分享一下Python異步與JavaScript原生異步有什么區別的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

現在假設我們要請求一個網址:http://httpbin.org/delay/5,這個網址請求以后,需要等待5秒鐘才會返回結果。我們使用  jQuery來寫一段 JavaScript 代碼:

function test_async(){     $.ajax({type: 'GET',             contentType: 'application/json; charset=utf-8',             url: 'http://httpbin.org/delay/5',             success: function (response) {                 console.log('5秒請求返回:', response)              }         })     var a = 1 + 1     a = a * 2     console.log(a)     $.ajax({type: 'GET',             contentType: 'application/json; charset=utf-8',             url: 'http://httpbin.org/ip',             success: function (response) {                 console.log('查詢 IP 返回:', response)              }         })     console.log('這里是代碼的末尾') }

運行效果如下圖所示:

Python異步與JavaScript原生異步有什么區別

可以看出來,整個代碼的執行邏輯與我們生活中的異步是一致的,首先發起了一個5秒的請求,但是程序不會卡住等待,而是繼續運行后面的代碼,然后發起新的請求。由于新的請求返回時間短,所以新的請求很快返回并打印,最后才是打印的5秒請求的返回結果。

這就像是我們打開了洗衣機的電源,然后去淘米煮飯,米放進了電飯鍋,打開電飯鍋電源,然后去看書,最后飯先煮好,然后衣服再洗完。

JavaScript 原生的異步請求的過程,與日常生活中的邏輯很像。所以很容易就能理解 JavaScript 的異步流程。

但是 Python 里面,異步又是另外一種情況了。

我們來寫一段代碼:

import asyncio import aiohttp  async def main():     async with aiohttp.ClientSession() as client:         response = await client.get('http://httpbin.org/delay/5')         result = await response.json()         print('5秒請求返回:', result)         a = 1 + 1         a = a * 2         print(a)         new_response = await client.get('http://httpbin.org/ip')         new_result = await new_response.json()         print('查詢 IP 返回:', new_result)         print('這里是代碼的末尾')  asyncio.run(main())

運行效果如下圖所示:

Python異步與JavaScript原生異步有什么區別

可以看出,程序依然是串行運行的,根本就沒有異步痕跡。

要讓程序異步運行,我們需要湊夠一批任務提交給 asyncio,讓它自己通過事件循環來調度這些任務:

import asyncio import aiohttp   async def do_plus():     a = 1 + 1     a = a * 2     print(a)   async def test_delay(client):     response = await client.get('http://httpbin.org/delay/5')     result = await response.json()     print('5秒請求返回:', result)   async def test_ip(client):     response = await client.get('http://httpbin.org/ip')     result = await response.json()     print('查詢 IP 返回:', result)   async def test_print():     print('這里是代碼的末尾')   async def main():     async with aiohttp.ClientSession() as client:         tasks = [                 asyncio.create_task(test_delay(client)),                 asyncio.create_task(do_plus()),                 asyncio.create_task(test_ip(client)),                 asyncio.create_task(test_print())                 ]         await asyncio.gather(*tasks)  asyncio.run(main())

運行效果如下圖所示:

Python異步與JavaScript原生異步有什么區別

這是由于,在asyncio 里面,task是可以并行的最小單位,并且,task  要湊夠一批一起通過asyncio.gather或者asyncio.wait提交給事件循環以后,才能并行起來。

當使用代碼asyncio.create_task(異步函數())的時候,這個異步函數實際上并沒有真正運行,所以,在上面的代碼中:

tasks = [                 asyncio.create_task(test_delay(client)),                 asyncio.create_task(do_plus()),                 asyncio.create_task(test_ip(client)),                 asyncio.create_task(test_print())                 ]

創建了一個包含4個task 的列表,此時這4個異步函數中的代碼都還沒有執行。

當再調用await asyncio.gather(*tasks)時,這4個任務被作為4個參數傳入到了 asyncio.gather函數中,于是  Python 的事件循環開始調度他們。在這些異步函數中,包含await的地方,就是在告訴 Python,await后面的這個函數可能會有 IO  等待,可以掛起等一會再來看,現在可以去檢查事件循環里面其他異步任務是否已經結束等待可以運行。而沒有  await的地方依然是串行的,例如do_plus里面的三行代碼就是按順序一次性運行完成的。

所以,當我們使用 Python 的 asyncio 寫異步代碼時,我們需要提前安排好異步的切換位置并包裝為異步任務,然后把一批任務一次性提交給  asyncio,讓 Python 自己根據我們安排好的切換邏輯來調度這些任務。

這就像是,當我寫 JavaScript 的時候,我親自上陣先把洗衣機電源打開,然后我再來考慮接下來要利用等待時間做什么事情。

當我寫 Python  的時候,我需要提前把整個計劃都安排好:先打開洗衣機,在等待的時間淘米煮飯,然后再看書。并把這個計劃表提交給一個專門做事情的人來執行。

以上就是“Python異步與JavaScript原生異步有什么區別”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

衢州市| 八宿县| 岳池县| 洪泽县| 遵义市| 黄陵县| 平塘县| 河源市| 禹城市| 长泰县| 民和| 榆树市| 乃东县| 桃源县| 馆陶县| 库尔勒市| 鹿邑县| 项城市| 区。| 政和县| 香格里拉县| 天台县| 裕民县| 乐亭县| 镇平县| 金溪县| 北流市| 西充县| 达州市| 纳雍县| 长武县| 新兴县| 济宁市| 精河县| 巴塘县| 中方县| 县级市| 株洲市| 汪清县| 师宗县| 兴安盟|