新聞中心
我們知道,協(xié)程本質(zhì)上是單線程單進程,通過充分利用IO等待時間來實現(xiàn)高并發(fā)。在IO等待時間之外的代碼,還是串行運行的。因此,如果協(xié)程非常多,多少每個協(xié)程內(nèi)部的串行代碼運行時間超過了IO請求的等待時間,那么它的并發(fā)就會有一個上限。

廣南網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站設(shè)計等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)公司成立與2013年到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
舉個例子,電飯煲煮飯,洗衣機洗衣服,熱水壺燒水,他們都是啟動設(shè)備以后就能自己運行,我們可以利用他們自己運行的時間,讓這三件事情看起來幾乎在同時進行。但如果除了這三件事情外,還有開電視,開空調(diào),發(fā)微信……等等幾十個事情。每個事情單獨拿出來確實都只需要做個開頭,剩下的就是等,但由于做這個開頭也需要時間,因此把他們?nèi)繂悠饋硪惨簧贂r間,你的效率還是被卡住。
現(xiàn)在,如果有兩個人一起來做這些事情,那情況就不一樣了。一個人煮飯和燒水,另一個人開洗衣機,開電視和空調(diào)。效率進一步提升。
這就是協(xié)程與多進程的結(jié)合,每個進程里面多個協(xié)程同時運行,充分利用CPU的每一個核心,又充分利用了IO等待時間,把CPU跑滿,把網(wǎng)絡(luò)帶寬跑滿。強強聯(lián)合,速度更快。
有一個第三方庫aiomultiprocess,讓你能用幾行代碼就實現(xiàn)多進程與協(xié)程的組合。
首先使用pip安裝:
python3 -m pip install aiomultiprocess
它的語法非常簡單:
from aiomultiprocess import Pool
async with Pool() as pool:
results = await pool.map(協(xié)程, 參數(shù)列表)
只需要3行代碼,它就會在你CPU上每個核啟動一個進程,每個進程中不停啟動協(xié)程。
我們來寫一段實際代碼:
import asyncio
import httpx
from aiomultiprocess import Pool
async def get(url):
async with httpx.AsyncClient() as client:
resp = await client.get(url)
return resp.text
async def main():
urls = [url1, url2, url3]
async with Pool() as pool:
async for result in pool.map(get, urls):
print(result) # 每一個URL返回的內(nèi)容
if __name__ == '__main__':
asyncio.run(main())
之前我寫異步協(xié)程文章的時候,有些人同學(xué)會問我,爬蟲的速度真的那么重要嗎?難道不是突破反爬蟲最重要嗎?
我的回答是,不要看到用aiohttp請求網(wǎng)址就覺得是做爬蟲。在微服務(wù)里面,自己請求自己的HTTP接口,也需要使用httpx或者aiohttp。在這樣的場景里面,速度就是非常的重要,有時候就是需要做到越快越好。
文章標題:協(xié)程與多進程的完美結(jié)合
分享地址:http://fisionsoft.com.cn/article/dpiscgg.html


咨詢
建站咨詢
