在同步线程中使用的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库-线程池相关推荐

  1. python 无头浏览器多线程_基于Python, Selenium, Phantomjs无头浏览器访问页面

    引言: 在自动化测试以及爬虫领域,无头浏览器的应用场景非常广泛,本文将梳理其中的若干概念和思路,并基于代码示例其中的若干使用技巧. 1. 无头浏览器 通常大家在在打开网页的工具就是浏览器,通过界面上输 ...

  2. 26_多线程_第26天(Thread、线程创建、线程池)_讲义

    今日内容介绍 1.多线程 2.线程池 01进程概念 A:进程概念 a:进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行, 即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能 ...

  3. 26_多线程_第26天(Thread、线程创建、线程池)

    今日内容介绍 1.多线程 2.线程池 01进程概念 A:进程概念 a:进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行, 即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能 ...

  4. SpringBoot中的异步操作与线程池

    线程池类型 Java通过 java.util.concurrent.Executors 的静态方法提供五种线程池 newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需 ...

  5. 复盘Spring中定时任务和异步线程池

    ​ 项目中最近使用了多个定时任务处理业务需求,于是在实现业务逻辑过程中,产生了上图一些思考和疑问,现在利用空余时间进行一次复盘. 项目搭建 项目搭建环境:JDK1.8+SpringBoot 主启动类: ...

  6. 复盘SpringBoot中定时任务和异步线程池

    作者:溪~源 blog.csdn.net/xuan_lu/article/details/110568508 项目中最近使用了多个定时任务处理业务需求,于是在实现业务逻辑过程中,产生了上图一些思考和疑 ...

  7. 浅谈线程池(中):独立线程池的作用及IO线程池

    在上一篇文章中,我们简单讨论了线程池的作用,以及CLR线程池的一些特性.不过关于线程池的基本概念还没有结束,这次我们再来补充一些必要的信息,有助于我们在程序中选择合适的使用方式. 独立线程池 上次我们 ...

  8. 中fifo算法_java线程池,工作窃取算法

    前言 在上一篇<java线程池,Executors阿里开发规范中为什么禁止使用Executors?>中我们谈及了线程池,同时又发现一个现象,当最大线程数还没有满的时候耗时的任务全部堆积给了 ...

  9. 浅析Nginx中各种锁实现丨Nginx中手写一个线程池丨Nginx中反向代理,正向代理,负载均衡,静态web服务丨C++后端开发

    学会nginx中锁的使用,让你对锁豁然开朗 1. 反向代理,正向代理,负载均衡,静态web服务 2. nginx 中 accept 锁实现 自旋锁 信号量 3. nginx 中 线程池 实现以及详解虚 ...

最新文章

  1. python数据模型的意义_Python 数据模型
  2. 完美,竟然用一个脚本就把系统升级到https了,且永久免费!
  3. python类的属性和对象属性_在python的类中动态添加属性与生成对象
  4. DeepBrain 李传丰:当语义技能商店应用达到百万量级的时候,语音交互时代才会真正成熟 | WARE 2017
  5. asp.net页生命周期图解---msdn
  6. python正则匹配html标签_Python爬虫常用正则表达式及HTML网页标签分析总结
  7. queueMicrotask 来执行微任务
  8. JS校验上传图片类型
  9. LoRa网关与服务器通信——PROTOCOL
  10. 哪些网站不适合做seo优化
  11. 通过关键词采集百度网址脚本
  12. C++【STL】【string类的使用】
  13. Adobe PS常用快捷键
  14. html5批量修改本地文件名,文件名批量更名技巧;将文件夹名添加到文件名上-批量修改文件名...
  15. charles简介使用
  16. 都说在阿里年薪百万不难,面试入职阿里需要准备什么?
  17. 基于yolov8的检测分割跟踪软件系统(含Pyqt界面,附下载链接和演示视频,集成四种多目标跟踪算法,模型已训好)
  18. 基于微信小程序的答题系统
  19. JDBC 的代码逻辑封装
  20. Matlab图像处理基础(一)图像类型的转换

热门文章

  1. linux常用工具命令
  2. 第16课:动手实战中文句法依存分析
  3. 命令行下jq才是JSON 处理利器呀
  4. dojo.publish 和 dojo.subscribe
  5. 如何解决微服务的数据一致性分发问题
  6. JUnit+JMockit单元测试
  7. 斯诺登:FBI需要苹果帮助才能解锁iPhone完全扯淡
  8. Linux内核模块(二)
  9. 搭建Linux安全的Squid代理服务器
  10. 别为iptables日志付出太多-一种Linux防火墙优化方法