在Python同步方法中調(diào)用異步方法不阻塞主流程的幾種方案
如果你想在 同步方法 中調(diào)用 異步方法 save_category_icon,并且不阻塞主線程,可以使用 asyncio.create_task() 或 threading/concurrent.futures 來實現(xiàn)。
方案 1:使用 asyncio.create_task()(推薦)
如果你的代碼 運行在事件循環(huán)中(如 Flask + Quart 或 FastAPI),可以使用:
import asyncio
async def save_category_icon(category_id=0, category_name=None):
await asyncio.sleep(2) # 模擬異步任務
print(f"Icon saved for category {category_id} - {category_name}")
def edit_category():
loop = asyncio.get_event_loop()
loop.create_task(save_category_icon(category_id=1, category_name="Test"))
print("Main process continues...") # 不會等待異步任務完成
edit_category()
? 優(yōu)點:
- 不會阻塞主線程
- 任務會在后臺執(zhí)行
- 適用于已運行的
asyncio事件循環(huán)(FastAPI、Quart 等)
方案 2:使用 threading(適用于 Flask 同步環(huán)境)
如果你的代碼在 Flask(同步框架)中運行,推薦用 threading 運行異步方法:
import threading
import asyncio
def run_async_task():
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(save_category_icon(category_id=1, category_name="Test"))
def edit_category():
threading.Thread(target=run_async_task, daemon=True).start()
print("Main process continues...") # 不會等待異步任務完成
edit_category()
? 優(yōu)點:
- 不會阻塞 Flask 主進程
- 在 Flask 等同步環(huán)境下仍可運行異步任務
daemon=True確保進程退出時線程自動關(guān)閉
方案 3:使用 concurrent.futures(適用于高并發(fā)情況)
如果你的異步任務是 CPU 密集型 或者需要更好的線程池管理,可以使用 concurrent.futures:
import asyncio
from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor()
def run_async_task():
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(save_category_icon(category_id=1, category_name="Test"))
def edit_category():
executor.submit(run_async_task) # 提交任務到線程池
print("Main process continues...")
edit_category()
? 優(yōu)點:
- 適用于高并發(fā)任務
- 可以復用 ThreadPoolExecutor,提高性能
- 不阻塞主進程
選哪個方案?
| 方案 | 適用場景 | 優(yōu)點 |
|---|---|---|
asyncio.create_task() | 代碼已經(jīng)運行在事件循環(huán)(FastAPI、Quart) | 輕量級,非阻塞 |
threading.Thread() | Flask 或 Django(同步框架) | 適用于 Flask,后臺執(zhí)行任務 |
concurrent.futures.ThreadPoolExecutor | 高并發(fā)或多個異步任務 | 適用于 CPU 密集型任務 |
推薦最佳方案
- FastAPI、Quart: ? 使用
asyncio.create_task() - Flask、Django(同步): ? 使用
threading.Thread() - 高并發(fā)任務: ? 使用
concurrent.futures.ThreadPoolExecutor
這樣 異步任務會在后臺運行,不會阻塞主流程!
總結(jié)
到此這篇關(guān)于在Python同步方法中調(diào)用異步方法不阻塞主流程的幾種方案的文章就介紹到這了,更多相關(guān)Python同步方法調(diào)用異步方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyTorch使用Torchdyn實現(xiàn)連續(xù)時間神經(jīng)網(wǎng)絡(luò)的代碼示例
神經(jīng)常微分方程(Neural ODEs)是深度學習領(lǐng)域的創(chuàng)新性模型架構(gòu),它將神經(jīng)網(wǎng)絡(luò)的離散變換擴展為連續(xù)時間動力系統(tǒng),本文將基于Torchdyn(一個專門用于連續(xù)深度學習和平衡模型的PyTorch擴展庫)介紹Neural ODE的實現(xiàn)與訓練方法,需要的朋友可以參考下2025-02-02
Python實現(xiàn)的對一個數(shù)進行因式分解操作示例
這篇文章主要介紹了Python實現(xiàn)的對一個數(shù)進行因式分解操作,結(jié)合實例形式分析了Python因式分解數(shù)值運算相關(guān)操作技巧,需要的朋友可以參考下2019-06-06
Python streamlit庫快速構(gòu)建交互式Web應用
Streamlit 是一個專為數(shù)據(jù)科學家和機器學習工程師設(shè)計的Python庫,它可以快速構(gòu)建交互式Web應用,下面就來詳細的介紹一下streamlit庫的使用,感興趣的可以了解一下2025-12-12
Python實現(xiàn)圖片和base64轉(zhuǎn)換詳解
這篇文章主要介紹了Python實現(xiàn)圖片和base64轉(zhuǎn)換詳解,Base64是一種二進制到文本的編碼方式,如果要更具體一點的話,可以認為它是一種將 byte數(shù)組編碼為字符串的方法,而且編碼出的字符串只包含ASCII基礎(chǔ)字符,需要的朋友可以參考下2024-01-01
Python身份運算符(is/is not)與雙等號的區(qū)別詳解
身份運算符(is/is not)與雙等號的區(qū)別是Python編程中的核心知識點之一,掌握這項技能對于提升編程效率和應用效果至關(guān)重要,本文通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下2026-05-05

