天天看點

Python asyncio程式設計之異步與非異步子產品混合異步實作

今天繼續給大家介紹Python相關知識,本文主要内容是Python asyncio程式設計之異步與非異步子產品混合異步實作。

一、異步與非異步子產品混合異步程式設計實作方法

我們在使用asyncio子產品進行異步程式設計時,有時會遇到架構中部分子產品不支援協程異步。為了與這樣的子產品進行對接,那麼我們就需要使用線程池的方式來實作異步。這樣一來,相比于使用協程的方式,需要耗費更多的資源。

二、異步與非異步子產品混合異步程式設計實作實戰

異步與非異步子產品混合異步程式設計代碼如下所示:

import requets
import asyncio

async def download_image(url):
    print("Downloading......")
    loop=asyncio.get_event_loop()
    future=loop.run_in_executor(None,requets.get,url)
    response=await future
    print("OK!")
    filename=
    with open(filename,"wb") as file_object:
        file_object.write(response.content)

url_list=[]
tasks=[download_image(url) for url in url_list]
loop=asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
           

上述代碼中使用的函數作用如下:

1、get_event_loop()

該函數如果在協程中被調用,則會傳回目前的事件循環,如果目前沒有事件循環,則會建立一個事件循環。

2、run_in_executor()

該函數可以在目前的事件循環中添加新的操作。

3、run_until_complete()

該函數可以執行事件循環隊列。

上述代碼執行結果如下所示:

Python asyncio程式設計之異步與非異步子產品混合異步實作

從上圖中可以看出,在使用線程池方式後,成功實作了request子產品(不支援協程的子產品)的異步操作。

原創不易,轉載請說明出處:https://blog.csdn.net/weixin_40228200