asyncio 中给running 的loop 动态添加 Future Task
https://my.oschina.net/backbye/blog/1919486
asyncio 提供了两个给运行中的事件循环(loop) 添加 事件的方法
call_soon_threadsafe() 、run_coroutine_threadsafe()
因为我们一般的场景中会另起一个线程来启动loop( loop.run_forever() ),所以上面两个方法设计成线程安全
但是上面两个方法并不能满足我们全部的需要:
1. run_coroutine_threadsafe 只能用于传入一个协程,而不能直接传入task对象(这样才方便我们在主进程中随时查看任务的执行情况和获取结果),当然可以去修改源码,但是不建议这么做
2. run_forever 虽然解决了可以随时加入任务的问题,但是带来一个新的问题:这个线程会一直运行下去,除非ctrl-C, 因为1,所以我们无法根据任务的执行情况来loop.stop, 而且由于线程安全,即使你执行了loop.stop() 也不会起任何作用
所以源头要回到线程安全上去解决,查看源码发现是通过一个管道文件来实现的,可以理解为内置了一个队列,一切对loop的修改都要通过发送一个信号到这个队列,才能同步到running loop的那个线程中,从而产生效果。
发送信号代码:loop._csock.send(b'\0')
下面给个示例,自己去体会
import asyncio
import threading def start_loop(loop):
asyncio.set_event_loop(loop)
loop.run_forever()
print(asyncio.Task.all_tasks().pop().result()) async def do_some_work(name):
for i in range(5):
print(f"{name}: is working")
await asyncio.sleep(1)
return True loop = asyncio.new_event_loop() threading.Thread(target=start_loop, args=(loop,)).start() task = loop.create_task(do_some_work("Lili")) loop._csock.send(b'\0') while True:
if task.done():
loop.stop()
loop._csock.send(b'\0')
break
asyncio 中给running 的loop 动态添加 Future Task的更多相关文章
- bootstrap中的动态加载出来的图片轮播中的li标签中的class="active"的动态添加移除
//该方法是在slide改变时立即触发该事件, $('#myCarousel').on('slide.bs.carousel', function () { $("#myCarousel o ...
- COM动态添加删除成员,类似JavaScript中调用的对象
在JavaScript中调用对象时,可动态添加删除成员如: var obj=new Object; obj.member1='aaaaa'; obj.fun1=function() { alert(' ...
- asp.net动态添加控件学习
看了老师的教程后,自己一点感悟记录下来: 1.在页面提交后,动态生成的控件会丢失, 但如果生成控件的代码在pageload中,就可以,原理是每次生成页面都执行生成. 2.动态按件或页面原来控件, 在页 ...
- iOS运行时使用(动态添加方法)
1 举例 我们实现一个Person类 然后Person 其实是没得对象方法eat:的 下面调用person的eat方法 程序是会奔溃的 那么需要借助运行时动态的添加方法 Person *p = [[ ...
- elastic-job动态添加定时任务
在elastic-job的使用过程中,我们会遇到动态添加定时任务的时候,但是官网上面并没有对这块内容进行说明.按照我的理解以及官网上面elastic-job的框架图,ej的定时任务其实是存储在zook ...
- AngularJS 导航栏动态添加.active
在传统jQuery中,实现导航栏动态添加.active类的思路比较简单,就是当点击的时候,清除其他.active,然后给当前类加上.active. 但是在AngularJS中,就不能再采用这种jQue ...
- ios开发runtime学习四:动态添加属性
#import "ViewController.h" #import "Person.h" #import "NSObject+Property.h& ...
- Hyperledger Fabric组织的动态添加和删除
前言 在Fabric定制联盟链网络工程实践中,我们虚拟了一个工作室的联盟链网络需求,并根据此需求分析了整个网络的架构且已经完成了一个简单 fabric 网络模型.本文将在其基础上,在 mychanne ...
- Celery 分布式任务队列快速入门 以及在Django中动态添加定时任务
Celery 分布式任务队列快速入门 以及在Django中动态添加定时任务 转自 金角大王 http://www.cnblogs.com/alex3714/articles/6351797.html ...
随机推荐
- Scala对class/object反射
近期有需求,要根据解析字符串,根据字符串的内容去调用方法.想到的基本就是使用反射.但是基本上能找到的资料,全没有讲scala的反射.只有零星点点的讲解.大部分都是用scala的语法写java反射最后翻 ...
- Django基础之MTV模型
一.Django基础 一.Django简介 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型(Model).视图(View)和控制器(Control ...
- Linux下搭建redis服务器
1.redis需要gcc的编译环境,在线安装gcc:# yum install gcc-c++ 2.上传redis的压缩包到Linux系统,解压 3.进入源码目录,编译(注意要有makefile), ...
- 二叉树df
二叉树 最有搜索算法 打印偶节点 不要用递归
- 让运行着的ASP.NET Web程序重新启动
在运行中的Web程序,会随时的监测这web.config文件的变化,只要web.config文件有变动,那么Application就会重新启动.所以,在一个工具类中我们可以封装一个方法,该方法用来重新 ...
- 海量数据找相同数,高配词,不重复的数,判断一个数是否存在,查询串,不同电话号码的个数,中位数,按照query频度排序,topk
这类题目,首先需要确定可用内存的大小,然后确定数据的大小,由这两个参数就可以确定hash函数应该怎么设置才能保证每个文件的大小都不超过内存的大小,从而可以保证每个小的文件都能被一次性加载到内存中. 1 ...
- ubuntu下ldd,查看程序动态库信息
ldd list, dynamic, dependencies linux-vdso.so. => (0x00007ffe9d9b6000) libstdc++.so. => /usr/ ...
- (已解决)Eclipse报错:Could not find XXX.apk. 没有Android项目命名. There is no android project named
可能是你把当前项目设置为library项目了,按以下步骤切换回普通项目: 选择 Project->Properties 在左边的列表中,选择 Android 取消钩中"Is Libra ...
- C# 深拷贝和浅拷贝
在编码中.经常会遇到赋值操作.值类型就不说了.如果是引用类型赋值.其实是引用传递,即赋值的是一个引用.比如: Person p1 = new Person("张三", " ...
- model.addattribute()的作用
1.往前台传数据,可以传对象,可以传List,通过el表达式 ${}可以获取到, 类似于request.setAttribute("sts",sts)效果一样. 2.@ModelA ...