python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python同步方法调用异步方法

在Python同步方法中调用异步方法不阻塞主流程的几种方案

作者:oliver.chau

这篇文章主要介绍了在Python同步方法中调用异步方法不阻塞主流程的几种方案,包括使用asyncio.create_task()、threading和concurrent.futures,文中通过代码介绍的非常详细,需要的朋友可以参考下

如果你想在 同步方法 中调用 异步方法 save_category_icon,并且不阻塞主线程,可以使用 asyncio.create_task() 或 threading/concurrent.futures 来实现。

方案 1:使用 asyncio.create_task()(推荐)

如果你的代码 运行在事件循环中(如 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()

✅ 优点

方案 2:使用 threading(适用于 Flask 同步环境)

如果你的代码在 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()

✅ 优点

方案 3:使用 concurrent.futures(适用于高并发情况)

如果你的异步任务是 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()

✅ 优点

选哪个方案?

方案适用场景优点
asyncio.create_task()代码已经运行在事件循环(FastAPI、Quart)轻量级,非阻塞
threading.Thread()Flask 或 Django(同步框架)适用于 Flask,后台执行任务
concurrent.futures.ThreadPoolExecutor高并发或多个异步任务适用于 CPU 密集型任务

推荐最佳方案

这样 异步任务会在后台运行,不会阻塞主流程!

总结

到此这篇关于在Python同步方法中调用异步方法不阻塞主流程的几种方案的文章就介绍到这了,更多相关Python同步方法调用异步方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文