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

 更新时间:2025年03月14日 08:21:47   作者: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()

✅ 优点

  • 不会阻塞主线程
  • 任务会在后台执行
  • 适用于已运行的 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同步方法调用异步方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 对python过滤器和lambda函数的用法详解

    对python过滤器和lambda函数的用法详解

    今天小编就为大家分享一篇对python过滤器和lambda函数的用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • PyTorch使用Torchdyn实现连续时间神经网络的代码示例

    PyTorch使用Torchdyn实现连续时间神经网络的代码示例

    神经常微分方程(Neural ODEs)是深度学习领域的创新性模型架构,它将神经网络的离散变换扩展为连续时间动力系统,本文将基于Torchdyn(一个专门用于连续深度学习和平衡模型的PyTorch扩展库)介绍Neural ODE的实现与训练方法,需要的朋友可以参考下
    2025-02-02
  • 使用Python简单实现比较PDF文件差异

    使用Python简单实现比较PDF文件差异

    在处理合同、法律文书或技术文档时,常常会遇到多个版本的同一 PDF,本文将逐步演示如何配置环境并使用示例代码进行比较,还会介绍一些可选的高级设置以满足不同需求,希望对大家有所帮助
    2026-03-03
  • Python实现的对一个数进行因式分解操作示例

    Python实现的对一个数进行因式分解操作示例

    这篇文章主要介绍了Python实现的对一个数进行因式分解操作,结合实例形式分析了Python因式分解数值运算相关操作技巧,需要的朋友可以参考下
    2019-06-06
  • 详解Python中的静态方法与类成员方法

    详解Python中的静态方法与类成员方法

    这篇文章主要介绍了关于Python中静态方法与类成员的相关资料,文中通过示例代码给大家详细总结了两者在语法和使用上的区别,有需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • Python streamlit库快速构建交互式Web应用

    Python streamlit库快速构建交互式Web应用

    Streamlit 是一个专为数据科学家和机器学习工程师设计的Python库,它可以快速构建交互式Web应用,下面就来详细的介绍一下streamlit库的使用,感兴趣的可以了解一下
    2025-12-12
  • Python中的字符串操作和编码Unicode详解

    Python中的字符串操作和编码Unicode详解

    其实字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。下面这篇文章主要给大家介绍了Python中的字符串操作和编码Unicode详解的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • pytorch实现mnist分类的示例讲解

    pytorch实现mnist分类的示例讲解

    今天小编就为大家分享一篇pytorch实现mnist分类的示例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python实现图片和base64转换详解

    Python实现图片和base64转换详解

    这篇文章主要介绍了Python实现图片和base64转换详解,Base64是一种二进制到文本的编码方式,如果要更具体一点的话,可以认为它是一种将 byte数组编码为字符串的方法,而且编码出的字符串只包含ASCII基础字符,需要的朋友可以参考下
    2024-01-01
  • Python身份运算符(is/is not)与双等号的区别详解

    Python身份运算符(is/is not)与双等号的区别详解

    身份运算符(is/is not)与双等号的区别是Python编程中的核心知识点之一,掌握这项技能对于提升编程效率和应用效果至关重要,本文通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
    2026-05-05

最新评论