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

告别重复劳动:用Python+pywinauto打造你的微信个人助理(自动回复/收款/定时发消息)

本文介绍如何利用Python和pywinauto库构建微信个人助手,实现自动回复、定时消息、智能收款等功能,告别重复劳动。通过详细的代码示例和配置指南,帮助开发者快速掌握微信自动化技术,提升工作效率。

weixin_42568801的博客 332

CentOS7无外网环境下MySQL8.0完整离线部署指南

本文详细介绍了在CentOS7无外网环境下,如何通过MySQL8.0二进制包进行完整离线部署。指南涵盖了从环境准备、依赖安装、用户与目录创建,到数据库初始化、服务配置及远程访问设置的全过程,并提供了关键的避坑技巧,帮助企业运维人员在内网环境中高效、稳定地搭建MySQL数据库服务。

xxx12的博客 1029

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

海康视觉平台VisionMaster使用学习笔记(1)

双击图像源设置图像源的属性,像素格式分为Mono8和RDB24分别对应导入的图像是彩色还是黑白。打开相机驱动软件MVS,对连接的相机进行属性上的配置,先对相机的IP进行对应的设置。将自动触发的使能打开,保存配置好的相机属性,默认保存到用户集1中。点击MVS软件中的触发按钮,查看相机是否进行正常的触发拍照。打开VM软件添加一个图像源,选择图像源选项拖出图像源。回到VM软件中将选择相机选项选择到配置好参数的相机。取图方式也可以调整为相机取图,将图像源改为相机。双击相机进行连接后对相机的属性进行配置。

A567852的博客 1万+

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

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

zkcJava的博客 925

手持式激光测距仪全套方案

激光测距全套方案,包括原理图、源代码、PCB、BOM、光学部分资料,结构、特殊元件数据手册及供应商联系方式,提供调试技术文档。全套方案已成功打板验证,实现0.05~50m测量范围,精度在+/—1.5mm,激光波长635~650nm,功率《1mW。方案预留了TTL串口、RS485接口,可通过串口助手看到测量数据,可自行DIY或者商业开发。无论是电路小白,还是技术大拿,都能通过方案资料成功做出一套激光测距仪。

Laser01的博客 2055

基于Vivado2025的UltraScale+时序收敛优化实战案例

深入解析在Vivado2025环境中针对UltraScale+架构的时序收敛挑战,结合实际设计案例,分享关键优化策略与操作技巧,显著提升设计性能与收敛效率。vivado2025的更新特性为时序优化带来新机遇。

weixin_33660045的博客 344

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

组态王与DLT645-2007电能表通讯调试总结

组态王与电力协议DLT 645-2007调试总结 DLT 645-2007是多功能电能表通信协议,该标准由中国电力企业联合会2006年提出,该协议为主-从结构的半双工通信方式。手持单元或其它数据终端为主站,多功能电能表为从站。每个多功能电能表均有各自的地址编码。通信链路的建立与解除均由主站发出的信息帧来控制。帧是传送信息的基本单元,每帧由帧起始符、从站地址域、控制码、数据域长度、数据域、帧信息纵向校验码及帧结束符7个域组成,每部分由若干字节组成,帧格式如图1所示。 1.确定设备地址 地址域由 6 个字节构

逍遥子的博客 1万+

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

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

monkeyboy_tech的博客 504

基于Simulink的异步电机定子磁链定向控制(SFOC)仿真

本文带你从零构建了异步电机SFOC系统​ 的完整Simulink仿真模型,实现了:✅ 搭建异步电机、逆变器、风机负载的主电路与传感器模型;✅ 用MATLAB Function实现定子磁链观测(电压模型)、坐标变换、双闭环PI控制;✅ 验证SFOC在转速跟踪(响应0.2s、超调4%)、转矩响应(恢复0.15s)中的高性能;✅ 对比RFOC,明确SFOC在参数鲁棒性(转子电阻+50%时波动<2%)上的独特优势;✅ 理解SFOC“定子磁链定向+解耦控制”的核心思想(低成本高鲁棒性驱动的工程实现)。

xiaoheshang_123的博客 389

OSPF规划两大模型:双塔奇兵、犬牙交错

大家好,今天给大家带来的是OSPF规划两大模型:双塔奇兵、犬牙交错,让我们直接开始吧! OSPF规划之双塔奇兵 说明: OSPF 如果某个区域存在两个 ABR,并且在两个 ABR 上都对 area n 内的路由做了聚合操作。 最佳配置: 两台ABR之间的红线应该使用以太网的子接口技术,一个子接口属于area0,另一个属于 area n;或者该链路规划为 area n,同时配置虚连接; ABR 的 loopback0 规划入 area 0 OSPF 规划之犬牙交错 说明: 有时接入层的设备会以乱序的

网络技术联盟站 2423

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

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

gitblog_00631的博客 917

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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、付费专栏及课程。

余额充值