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的更多相关文章

  1. bootstrap中的动态加载出来的图片轮播中的li标签中的class="active"的动态添加移除

    //该方法是在slide改变时立即触发该事件, $('#myCarousel').on('slide.bs.carousel', function () { $("#myCarousel o ...

  2. COM动态添加删除成员,类似JavaScript中调用的对象

    在JavaScript中调用对象时,可动态添加删除成员如: var obj=new Object; obj.member1='aaaaa'; obj.fun1=function() { alert(' ...

  3. asp.net动态添加控件学习

    看了老师的教程后,自己一点感悟记录下来: 1.在页面提交后,动态生成的控件会丢失, 但如果生成控件的代码在pageload中,就可以,原理是每次生成页面都执行生成. 2.动态按件或页面原来控件, 在页 ...

  4. iOS运行时使用(动态添加方法)

    1 举例  我们实现一个Person类 然后Person 其实是没得对象方法eat:的 下面调用person的eat方法 程序是会奔溃的 那么需要借助运行时动态的添加方法 Person *p = [[ ...

  5. elastic-job动态添加定时任务

    在elastic-job的使用过程中,我们会遇到动态添加定时任务的时候,但是官网上面并没有对这块内容进行说明.按照我的理解以及官网上面elastic-job的框架图,ej的定时任务其实是存储在zook ...

  6. AngularJS 导航栏动态添加.active

    在传统jQuery中,实现导航栏动态添加.active类的思路比较简单,就是当点击的时候,清除其他.active,然后给当前类加上.active. 但是在AngularJS中,就不能再采用这种jQue ...

  7. ios开发runtime学习四:动态添加属性

    #import "ViewController.h" #import "Person.h" #import "NSObject+Property.h& ...

  8. Hyperledger Fabric组织的动态添加和删除

    前言 在Fabric定制联盟链网络工程实践中,我们虚拟了一个工作室的联盟链网络需求,并根据此需求分析了整个网络的架构且已经完成了一个简单 fabric 网络模型.本文将在其基础上,在 mychanne ...

  9. Celery 分布式任务队列快速入门 以及在Django中动态添加定时任务

    Celery 分布式任务队列快速入门 以及在Django中动态添加定时任务 转自 金角大王 http://www.cnblogs.com/alex3714/articles/6351797.html ...

随机推荐

  1. 教你写Makefile(很全,含有工作经验的)

    Makefile 值得一提的是,在Makefile中的命令,必须要以[Tab]键开始. 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了 ...

  2. 对比损失(Contrastive Loss)学习【转载】

    转自:https://blog.csdn.net/autocyz/article/details/53149760 https://www.tensorflow.org/tutorials/repre ...

  3. 阿里云香港主机自动换IP

    为什么要写这个脚本原因你懂的,现在都是直接封IP pip3 install aliyun-python-sdk-alidns aliyun-python-sdk-domain aliyun-pytho ...

  4. 带你零基础学习HTML5

    1个HTML5基础入门教程,4个HTML5小项目教程,带你零基础入门学习HTML5. [HTML5基础入门] 教程将会介绍HTML5中的新特性,包括结构标签.新型表单标签.文件操作.Canvas.本地 ...

  5. [LeetCode] 339. Nested List Weight Sum_Easy tag:DFS

    Given a nested list of integers, return the sum of all integers in the list weighted by their depth. ...

  6. [LeetCode] 98. Validate Binary Search Tree_Medium

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  7. np.percentile()

    np.percentile(a, q, axis=None, out=None, overwrite_input=False, interpolation='linear', keepdims=Fal ...

  8. chrome debug 服务端性能

    设置 http header 在 chrome 查看服务端性能 \Yii::$app->getResponse()->headers->set('Server-Timing', 'c ...

  9. 单点登录开源架构之CAS

    服务端 开源地址:https://github.com/apereo/cas Release版:https://github.com/apereo/cas/releases Windows下使用下载c ...

  10. python shutil.copytree 解决目标目录存在的情况

    直接修改copytree的实现即可,如下: #copytree中找到 os.makedirs(dst),加入判断,就这么简单 if not os.path.exists(dst): os.makedi ...