在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编程学习之如何判断3个数的大小

    Python编程学习之如何判断3个数的大小

    这篇文章主要给大家介绍了关于Python编程学习之如何判断3个数的大小的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Python进度条tqdm的用法详解

    Python进度条tqdm的用法详解

    这篇文章主要介绍了Python进度条tqdm的用法,这对于第三方库非常丰富的Python来说,想要实现这一功能并不是什么难事,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2021-08-08
  • Python随机生成带特殊字符的密码

    Python随机生成带特殊字符的密码

    这篇文章主要介绍了Python随机生成带特殊字符的密码的相关资料,需要的朋友可以参考下
    2016-03-03
  • 详解Python中命令行参数argparse的常用命令

    详解Python中命令行参数argparse的常用命令

    这篇文章主要为大家详细介绍了Python中命令行参数argparse的一些常用命令,文中的示例代码讲解详细,具有一定的学习价值,需要的可以了解一下
    2023-01-01
  • Python文件打开方式实例详解【a、a+、r+、w+区别】

    Python文件打开方式实例详解【a、a+、r+、w+区别】

    这篇文章主要介绍了Python文件打开方式,结合实例形式详细分析了Python文件打开函数的使用及a、a+、r+、w+等属性功能、使用区别与相关操作注意事项,需要的朋友可以参考下
    2019-03-03
  • Python中的图形绘制简单动画实操

    Python中的图形绘制简单动画实操

    这篇文章主要介绍了Python中的图形绘制简单动画实操, Matplotlib 是一个非常广泛的库,它也支持图形动画,动画工具以 matplotlib.animation 基类为中心,它提供了一个框架,围绕该框架构建动画,下面来看看具体的实现过程吧,需要的小伙伴可以参考一下
    2022-02-02
  • Python虚拟环境库virtualenvwrapper安装及使用

    Python虚拟环境库virtualenvwrapper安装及使用

    这篇文章主要介绍了Python虚拟环境库virtualenvwrapper安装及使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Python和Java的语法对比分析语法简洁上python的确完美胜出

    Python和Java的语法对比分析语法简洁上python的确完美胜出

    Python是一种广泛使用的解释型、高级编程、通用型编程语言,由吉多·范罗苏姆创造,第一版发布于1991年。这篇文章主要介绍了Python和Java的语法对比,语法简洁上python的确完美胜出 ,需要的朋友可以参考下
    2019-05-05
  • 对Python 数组的切片操作详解

    对Python 数组的切片操作详解

    今天小编就为大家分享一篇对Python 数组的切片操作详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 基于tensorflow指定GPU运行及GPU资源分配的几种方式小结

    基于tensorflow指定GPU运行及GPU资源分配的几种方式小结

    今天小编就为大家分享一篇基于tensorflow指定GPU运行及GPU资源分配的几种方式小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02

最新评论