当前位置: 代码网 > it编程>前端脚本>Python > 在Python同步方法中调用异步方法不阻塞主流程的几种方案

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

2025年03月14日 Python 我要评论
如果你想在同步方法中调用异步方法save_category_icon,并且不阻塞主线程,可以使用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()

✅ 优点

  • 不会阻塞主线程
  • 任务会在后台执行
  • 适用于已运行的 asyncio 事件循环(fastapi、quart 等)

方案 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()

✅ 优点

  • 不会阻塞 flask 主进程
  • 在 flask 等同步环境下仍可运行异步任务
  • daemon=true 确保进程退出时线程自动关闭

方案 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()

✅ 优点

  • 适用于高并发任务
  • 可以复用 threadpoolexecutor,提高性能
  • 不阻塞主进程

选哪个方案?

方案适用场景优点
asyncio.create_task()代码已经运行在事件循环(fastapi、quart)轻量级,非阻塞
threading.thread()flask 或 django(同步框架)适用于 flask,后台执行任务
concurrent.futures.threadpoolexecutor高并发或多个异步任务适用于 cpu 密集型任务

推荐最佳方案

  • fastapi、quart: ✅ 使用 asyncio.create_task()
  • flask、django(同步): ✅ 使用 threading.thread()
  • 高并发任务: ✅ 使用 concurrent.futures.threadpoolexecutor

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

总结

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com