python asyncio future 多线程_深究Python中的asyncio库-线程池
在同步线程中使用的run_in_executor就如它方法的名字所示,把协程放到了一个执行器里面,可以在一个线程池,也可以在一个进程池。另外还可以使用run_coroutine_threadsafe在其他线程执行协程(这是线程安全的)。
多线程def start_loop(loop):
asyncio.set_event_loop(loop)
loop.run_forever()
def shutdown(loop):
loop.stop()
async def b1():
new_loop = asyncio.new_event_loop()
t = Thread(target=start_loop, args=(new_loop,))
t.start()
future = asyncio.run_coroutine_threadsafe(a(), new_loop)
print(future)
print(f'Result: {future.result(timeout=2)}')
new_loop.call_soon_threadsafe(partial(shutdown, new_loop))
In : await b1()
Result: A
这里面有几个细节要注意:
协程应该从另一个线程中调用,而非事件循环运行所在线程,所以用asyncio.new_event_loop()新建一个事件循环
在执行协程前要确保新创建的事件循环是运行着的,所以需要用start_loop之类的方式启动循环
接着就可以用asyncio.run_coroutine_threadsafe执行协程a了,它返回了一个Future对象
可以通过输出感受到future一开始是pending的,因为协程a里面会sleep 1秒才返回结果
用future.result(timeout=2)就可以获得结果,设置timeout的值要大于a协程执行时间,要不然会抛出TimeoutError
一开始我们创建的新的事件循环跑在一个线程里面,由于loop.run_forever会阻塞程序关闭,所以需要结束时杀掉线程,所以用call_soon_threadsafe回调函数shutdown去停止事件循环
这里再说一下call_soon_threadsafe,看名字就知道它是线程安全版本的call_soon,其实就是在另外一个线程里面调度回调。BTW, 其实asyncio.run_coroutine_threadsafe底层也是用的它。
python asyncio future 多线程_深究Python中的asyncio库-线程池相关推荐
- python 无头浏览器多线程_基于Python, Selenium, Phantomjs无头浏览器访问页面
引言: 在自动化测试以及爬虫领域,无头浏览器的应用场景非常广泛,本文将梳理其中的若干概念和思路,并基于代码示例其中的若干使用技巧. 1. 无头浏览器 通常大家在在打开网页的工具就是浏览器,通过界面上输 ...
- 26_多线程_第26天(Thread、线程创建、线程池)_讲义
今日内容介绍 1.多线程 2.线程池 01进程概念 A:进程概念 a:进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行, 即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能 ...
- 26_多线程_第26天(Thread、线程创建、线程池)
今日内容介绍 1.多线程 2.线程池 01进程概念 A:进程概念 a:进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行, 即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能 ...
- SpringBoot中的异步操作与线程池
线程池类型 Java通过 java.util.concurrent.Executors 的静态方法提供五种线程池 newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需 ...
- 复盘Spring中定时任务和异步线程池
项目中最近使用了多个定时任务处理业务需求,于是在实现业务逻辑过程中,产生了上图一些思考和疑问,现在利用空余时间进行一次复盘. 项目搭建 项目搭建环境:JDK1.8+SpringBoot 主启动类: ...
- 复盘SpringBoot中定时任务和异步线程池
作者:溪~源 blog.csdn.net/xuan_lu/article/details/110568508 项目中最近使用了多个定时任务处理业务需求,于是在实现业务逻辑过程中,产生了上图一些思考和疑 ...
- 浅谈线程池(中):独立线程池的作用及IO线程池
在上一篇文章中,我们简单讨论了线程池的作用,以及CLR线程池的一些特性.不过关于线程池的基本概念还没有结束,这次我们再来补充一些必要的信息,有助于我们在程序中选择合适的使用方式. 独立线程池 上次我们 ...
- 中fifo算法_java线程池,工作窃取算法
前言 在上一篇<java线程池,Executors阿里开发规范中为什么禁止使用Executors?>中我们谈及了线程池,同时又发现一个现象,当最大线程数还没有满的时候耗时的任务全部堆积给了 ...
- 浅析Nginx中各种锁实现丨Nginx中手写一个线程池丨Nginx中反向代理,正向代理,负载均衡,静态web服务丨C++后端开发
学会nginx中锁的使用,让你对锁豁然开朗 1. 反向代理,正向代理,负载均衡,静态web服务 2. nginx 中 accept 锁实现 自旋锁 信号量 3. nginx 中 线程池 实现以及详解虚 ...
最新文章
- python数据模型的意义_Python 数据模型
- 完美,竟然用一个脚本就把系统升级到https了,且永久免费!
- python类的属性和对象属性_在python的类中动态添加属性与生成对象
- DeepBrain 李传丰:当语义技能商店应用达到百万量级的时候,语音交互时代才会真正成熟 | WARE 2017
- asp.net页生命周期图解---msdn
- python正则匹配html标签_Python爬虫常用正则表达式及HTML网页标签分析总结
- queueMicrotask 来执行微任务
- JS校验上传图片类型
- LoRa网关与服务器通信——PROTOCOL
- 哪些网站不适合做seo优化
- 通过关键词采集百度网址脚本
- C++【STL】【string类的使用】
- Adobe PS常用快捷键
- html5批量修改本地文件名,文件名批量更名技巧;将文件夹名添加到文件名上-批量修改文件名...
- charles简介使用
- 都说在阿里年薪百万不难,面试入职阿里需要准备什么?
- 基于yolov8的检测分割跟踪软件系统(含Pyqt界面,附下载链接和演示视频,集成四种多目标跟踪算法,模型已训好)
- 基于微信小程序的答题系统
- JDBC 的代码逻辑封装
- Matlab图像处理基础(一)图像类型的转换