python异步asyncio函数多线程操作run_in_executor和run_coroutine_threadsafe解析

如何在 Python 中混合使用同步和异步函数? 异步编程可以提高应用程序的性能和吞吐量,因为它可以充分利用 CPU 和 I/O 资源。当某个任务被阻塞时,事件循环可以切换到另一个任务,从而避免浪费 CPU 时间。此外,异步编程还可以简化代码,使其更易于维护和调试。我们最常用的是同步编程,在同步场景中,某个任务被阻塞时,整个线程都会被挂起,直到该任务完成,所以为了避免整个程序被阻塞的情况,又引入了多线程和锁。同步编程通常需要使用锁和其他同步原语来确保线程安全。混合编写的场景在实际开发过程中,通常会遇到同时进行异步和同步操作的场景。 阅读详情
AI摘要

本文详细介绍了Python 3.9及以上asyncio的to_thread函数与3.9以下版本使用run_in_executor和run_coroutine_threadsafe实现多线程的方法,对比了两种在不同场景的应用。

刚接触异步asyncio,发现python文档一个版本一个变化,恼火。
东拼西凑终于解决了asyncio的多线程操作,记录下来。对于一个门外汉。太难了。

首先python3.9版本终于封装了一个多线程函数

asyncio.to_thread(func, /, *args, **kwargs) #函数直接开线程,传递参数。感觉这才像python

对于3.9版本以下,asyncio多线程实现就是,两个函数:

run_in_executor 和 run_coroutine_threadsafe

对应两种需求。
一个是主线程,直接新开线程,运行阻塞函数。方式就像之前写的同步代码一样。代码如下(用到了run_in_executor):

from concurrent.futures import ThreadPoolExecutor
import asyncio,time

def zusehanshu():   #测试的阻塞函数
           time.sleep(10)
           threadmingzi()
           return "after 10s"
           
async def returnfuture(): #测试新建线程
        loop=asyncio.get_event_loop() 
        newexecutor=ThreadPoolExecutor()
        future=await loop.run_in_executor(newexecutor,zusehanshu)#执行阻塞函数
        print(future)
        
def threadmingzi(): #查看当前线程名字
        import threading
        print("当前线程名字:",threading.current_thread())
        
asyncio.run(returnfuture())

输出结果:
当前线程名字: <Thread(ThreadPoolExecutor-0_0, started daemon 3252)>
after 10s(10s后输出)

上面可以看到,已经新建线程中运行了
第二种是主线程,直接新开线程,运行项目循环event-loop,推送函数到event-loop,达到多线程运行。(用到了run_coroutine_threadsafe)

import asyncio,time,threading

async def zusehanshu():   #测试的阻塞函数
        await asyncio.sleep(10)
        threadmingzi()
        
def threadmingzi(): #查看当前线程名字
        print("当前线程名字:",threading.current_thread())
        
def startloop(loop): #新建event-loop
        threadmingzi() #看一下线程名字
        asyncio.set_event_loop(loop)
        loop.run_forever()
        
xinjianloop=asyncio.new_event_loop()
threading.Thread(target=startloop,args=(xinjianloop,)).start()
asyncio.run_coroutine_threadsafe(zusehanshu(),xinjianloop)

输出结果:
当前线程名字: <Thread(Thread-1, started 7672)>
当前线程名字: <Thread(Thread-1, started 7672)>
上面可以看到,已经新建线程中运行了

总结:
asyncio原理就是遍历event-loop获取消息,是一个单线程阻塞函数。
遍历过程中遇到某个协程阻塞就会卡住,会一直等待结果返回,这时候就需要用到多线程防止阻塞。
通过上面两个方式,run_in_executor,与同步函数调用相似。用的比较习惯。
而run_coroutine_threadsafe新线程中建立新event-loop,可以动态添加协程,这个用途自己考虑了。

【asyncio】run_coroutine_threadsafe与run_in_executor多线程操作 asyncio多线程多进程操作,run_in_executor与run_coroutine_threadsafe对比 阅读详情

相关推荐

一文掌握python协程asyncio(二)

协程进阶

qq_38120851的博客 1076

python中asyncio和run_in_executor混合

run_in_executor开了新线程后台处理耗时长的任务。这时候其它协程继续运行。 例如run_in_executor开了新线程去处理requests下载任务。 callFunc = functools.partial(requests.get, url=murl, timeout=10*60) result = await loop.run_in_executor(None, callFunc) #开了新线程处理下载,挂着等结果。其它定时器任务继续在老线程里跑 l.

wulong710的专栏 2700

asyncio 协程与多线程混用指南:5个场景解析与3个性能陷阱

本文深入解析Python中asyncio协程与多线程混用的5个关键场景与3个性能陷阱,帮助开发者在异步编程中高效集成同步代码。通过实战案例展示如何利用asyncio.to_thread、run_in_executor等工具实现I/O密集型与CPU密集型任务的优化处理,同时规避死锁、线程池配置不当等常见问题,提升混合编程的效率和稳定性。

weixin_30947043的博客 416

run_in_executor

  原型 : awaitable loop.run_in_executor(executor, func, *args)  参数 : executor 可以是  ThreadPoolExecutor / ProcessPool  , 如果是None 则使用默认线程池 可使用 yield from 或 await 挂起函数   作用  : 例如在异步事件循环中 写文件, 这种那么慢的操作...

x 8372

Python asyncio 入门:从伪异步到真正高并发的实战指南

asyncio 是 Python 实现高并发 I/O 密集型任务的核心机制,其本质是基于单线程事件循环的协作式调度系统,通过协程让渡(await)实现毫秒级多路复用。它不改变 CPU 执行模型,但彻底重构了 IO 等待期间的资源利用逻辑——当网络请求阻塞时,CPU 可立即切换处理其他就绪任务,从而将服务器并发能力从千级线程提升至十万级连接。技术价值在于极低的内存开销与确定性的调度延迟,广泛应用于 Web 服务(如 FastAPI)、爬虫、实时通信和微服务网关等场景。本文聚焦 asyncio 的真实落地,直击

weixin_34245082的博客 431

别再让MQTT回调函数拖慢你的Python程序了!paho-mqtt异步处理实战指南

本文探讨了Python中使用paho-mqtt库时回调函数性能瓶颈的解决方案,提供了五种异步处理架构,包括多线程消息分发、协程化处理、消息队列解耦等,显著提升MQTT消息处理效率。特别针对物联网高频数据传输场景,优化QoS级别选择,实现低延迟高吞吐。

weixin_30271335的博客 321

CPython asyncio 开发实践完全指南:调试模式、多线程协作、阻塞代码治理与异步生成器陷阱

asyncio 是 CPython 内置的异步 I/O 框架,其编程范式与传统"顺序"编程存在本质差异,稍不注意就会踩进"协程未被等待""任务异常无人取回""异步生成器在错误时机被回收"等陷阱。本文以 CPython 仓库中的官方开发指南 [Doc/library/asyncio-dev.rst](https://link.gitcode.com/i/ab31aaa832d1fd9cacf1b5e

gitblog_00003的博客 917

深入解析 Python asyncio 库:如何使用线程池实现高效异步编程

为了在asyncio中执行这些阻塞的IO操作,我们可以将它们放到线程池中执行,并使用asyncio的run_in_executor方法来调度它们。在上面的代码中,我们定义了一个do_something_blocking函数,它执行了一些阻塞的IO操作。但需要注意的是,在CPU密集型的应用中,多线程可能会导致性能下降,因为Python的全局解释锁(GIL)限制了多线程的并行执行。之所以要使用线程池来执行阻塞的IO操作,是因为在Python中,使用多线程来执行IO操作相比于多进程来说更加高效。

这家伙很懒,什么都没有留下 1374

Python 异步协程:asyncio、async/await、aiohttp

Windows GUI 主线程消息循环是典型。

freeking101的博客 4390

FinRL实战:5步搞定股票量化交易策略(附Python代码)

本文详细介绍了如何使用FinRL框架,通过5个步骤构建基于深度强化学习的股票量化交易策略。内容涵盖从环境搭建、数据获取与预处理,到交易环境构建、模型训练(如PPO算法),以及策略回测评估与优化的完整流程,并提供了可运行的Python代码示例,帮助读者快速入门AI驱动的量化交易。

weixin_29062865的博客 627

PyMuPDF`库实现PDF旋转功能

本文介绍了一个简单的Python应用程序,用于将PDF文件转换为旋转90度的PDF文件。通过使用`wx很抱歉,Markdown格式在当前聊天界面无法显示。我将为您提供纯文本格式的博客内容,您可以将其复制到Markdown编辑器中进行格式化。PDF转换工具本文介绍了一个简单的Python应用程序,用于将PDF文件转换为旋转90度的PDF文件。该工具使用了wxPython和PyMuPDF库。功能该PDF转换工具具有以下功能:1. 选择PDF文件:通过点击“选择文件”按钮,用户可以选择要转换的PDF文件。

Winfredzhang的博客 2735

KBEngine 内嵌 Python 3.7 的 asyncio 开发实战:调试模式、并发陷阱与常见错误排查指南

本文以 KBEngine 仓库内嵌的 CPython 3.7.3 官方文档 [Developing with asyncio(asyncio-dev.rst)](https://link.gitcode.com/i/26f72d4f15fa18c26fce0c82d14d1b04) 为主体,系统梳理 asyncio 异步编程中高频出现的调试模式开启方式、事件循环线程模型、阻塞代码处理、日志配置以及

gitblog_00452的博客 84

(3万字深度解析)Kaggle《房价预测:高级回归技巧》详解复现攻略

在这篇教程式文章中,我们从零开始完成了 Kaggle《房价预测:高级回归技巧》比赛的复现工作,涵盖了数据预处理、特征工程、模型训练、调优、解释和融合的完整流程。深入理解数据:阅读数据描述,结合常识对每个特征作出合理处理(如缺失值填充’None’表示无此设施 、异常值剔除 等)。对目标和偏态特征进行对数变换,使分布更平滑,从而更好满足模型假设并提升准确度。特征工程:我们创造了总面积、总浴室等新特征,整合信息提高模型可学习性。

qq_38334677的博客 1772

python3从入门到精通(五): python协程之asyncio模块(异步IO)(一)

Python的asyncio是一个异步I/O框架,通过单线程实现并发执行,特别适合I/O密集型场景。其核心原理为"事件循环+协程"模式:协程是可暂停/恢复的函数,由async def定义;await关键字用于暂停当前协程并将控制权交还事件循环;事件循环则负责调度任务队列、监听I/O事件并切换协程执行。asyncio还提供async with实现异步上下文管理,确保资源正确释放。整体采用非阻塞I/O和事件驱动机制,避免了多线程的上下文切换开销,使单线程能高效处理大量并发I/O操作。

zkcJava的博客 925

silvaco——GaN HEMT探索

上图为输出特性曲线 ,分别是在栅压为1v、3v、5v的情况下,可以看出在1v时器件处于截止状态,只有非常小近似于0的电流通过,随着栅压逐渐增大,沟道开启,产生漏极电流。上图为栅极漏电流曲线和转移特性曲线以及其提取的参数,可以看到阈值电压为=1.30249V,当栅压为0v时,Id=8.01032e-006,当栅压为5V时,Ig=3.11627e-006。albrct.n,低场迁移率模型,bn.albrct,an.albrct是albrct模型中的参数,可以由用户自己设定。lat.temp,晶格自热模型;

weixin_61913839的博客 7617

SPSS_Process—简单&平行&链式中介模型

本篇文章介绍采用SPSS的插件Process对简单中介、链式中介、平行中介模型进行检验的操作方法及结果解读。

m0_54401011的博客 4万+

python线程池 异步_Python3:如何向线程池提交异步函数?

每个线程的事件循环。例如:async def threadWorkAsync(obj):b = do_something()if b:# Run a and b as concurrent taskstask_a = asyncio.create_task(do_a())task_b = asyncio.create_task(do_b())await task_aawait task_bdef ...

weixin_39757122的博客 427

K8s(二十二):k8s集群如何部署一个Spring Boot项目(依赖于MySQL和Redis外部服务)

🔴 K8s(二十二):k8s集群如何部署一个Spring Boot项目(依赖于MySQL和Redis外部服务)

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2万+

Nanobot 从 Channel 消息处理看python协程的使用

asyncio.run_coroutine_threadsafe(coro, loop) 用于在主线程或其他工作线程中安全地提交协程到异步事件循环(loop)中执行的函数。它不会自动将新循环设置为当前线程的默认循环,主要用于需要手动管理循环、在不同线程中创建独立循环,或避免默认循环策略限制的场景。它将协程(coroutine)封装为任务(Task)对象,并立即调度该任务在事件循环中并在后台执行,从而允许在等待其完成的同时执行其他代码。用于将指定的事件循环实例(loop)设置为当前OS线程的默认事件循环。

monkeyboy_tech的博客 504

ESP32设备驱动-TM1637-驱动4位7段数码管

TM1637是一款带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成了MCU数字接口、数据锁存、LED高压驱动、键盘扫描等功能。 TM1637使用DIP20/SOP20封装,主要适用于电磁炉、微波炉、小家电的显示驱动。

视觉与物联智能 2118

33、嵌入式系统中的内存操作与实时操作系统

本博客详细探讨了嵌入式系统中的内存操作和实时操作系统(RTOS)的基本原理及应用。内容涵盖C、C++和MicroPython三种语言下的SDRAM读写示例,并结合机器人真空吸尘器的实际应用说明内存的使用场景。此外,还介绍了RTOS的核心概念、组件及其工作机制,包括任务、事件、互斥锁、信号量、队列等,并以FreeRTOS和Mbed OS为例展示了RTOS的配置与使用方法。最后,通过常见问题和实践项目加深对嵌入式系统开发的理解。

zz67890的博客 145

CPython asyncio 运行器(Runners)权威指南:asyncio.run 与 Runner 的用法、源码原理与 Ctrl-C 中断处理

本文以 CPython 官方文档 [Doc/library/asyncio-runner.rst](https://link.gitcode.com/i/d00fa2621ce74ccee9101f4b47bf3cb6) 为主线,系统讲解 asyncio 的两大高层运行原语:`asyncio.run()` 与 `asyncio.Runner` 上下文管理器。你将掌握它们的事件循环/执行器生命周期管

gitblog_01035的博客 381

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Tornado IOLoop 完全指南:主事件循环的接口、原理与实战

Tornado 的 `tornado.ioloop` 模块是整个框架的调度中枢。它提供一个基于非阻塞 socket 的 I/O 事件循环(event loop),承载着 HTTP 服务器、WebSocket、异步客户端等所有组件的读写事件分发与定时任务执行。读完本篇,你将掌握 `IOLoop` 的获取与生命周期管理、文件描述符事件注册、回调与定时器调度、`PeriodicCallback` 周期性

gitblog_00631的博客 917

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

KBEngine 内嵌 Python 3.7 asyncio 异步编程指南:协程、任务、流与事件循环全解析

asyncio 是 Python 标准库中用于编写**并发**代码的库,核心语法为 `async/await`。KBEngine 仓库内嵌了完整的 CPython 3.7.3 运行环境(见 [kbe/src/lib/python/Include/patchlevel.h](https://link.gitcode.com/i/a7ab1f3af626d347d9a0dc2c14fcf5db) 中的

gitblog_00752的博客 674

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

CPython asyncio 全景解析:用 async/await 编写结构化高并发异步 I/O 应用

本文以 CPython 源码树中的官方总览文档 [Doc/library/asyncio.rst](https://link.gitcode.com/i/31d32924a4a8f6e0d3635ba189cba5c8) 为核心骨架,系统梳理 Python 标准库 `asyncio`(异步 I/O)的完整能力版图:从高层 API(协程与任务、流式网络 I/O、子进程、队列、同步原语)到内省 API

gitblog_00499的博客 218
上一篇: 安卓火狐浏览器wifi远程调试没有扫描二维码应用的问题
下一篇: python如何调用pyc
hellojike
博客等级 码龄7年 23粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值