python协程之动态添加任务的方法


Posted in Python onFebruary 19, 2019

python协程只能运行在事件循环中,但是一旦事件循环运行,又会阻塞当前任务。所以只能在当前进程中再开一个线程,这个线程的主要任务是运行事件循环,就是event_loop,因为他是一个无限循环,会阻塞当前线程。

放一个自己写的demo,注释写的很详细。

另外还有一点需要注意,一个事件循环中不能运行另外一个事件循环。

运行结果:

python协程之动态添加任务的方法

import asyncio
from threading import Thread
 
 
async def production_task():
  i = 0
  while True:
    # 将consumption这个协程每秒注册一个到运行在线程中的循环,thread_loop每秒会获得一个一直打印i的无限循环任务
    asyncio.run_coroutine_threadsafe(consumption(i),
                     thread_loop) # 注意:run_coroutine_threadsafe 这个方法只能用在运行在线程中的循环事件使用
    await asyncio.sleep(1) # 必须加await
    i += 1
 
 
async def consumption(i):
  while True:
    print("我是第{}任务".format(i))
    await asyncio.sleep(1)
 
 
def start_loop(loop):
  # 运行事件循环, loop以参数的形式传递进来运行
  asyncio.set_event_loop(loop)
  loop.run_forever()
 
 
thread_loop = asyncio.new_event_loop() # 获取一个事件循环
run_loop_thread = Thread(target=start_loop, args=(thread_loop,)) # 将次事件循环运行在一个线程中,防止阻塞当前主线程
run_loop_thread.start() # 运行线程,同时协程事件循环也会运行
 
advocate_loop = asyncio.get_event_loop() # 将生产任务的协程注册到这个循环中
advocate_loop.run_until_complete(production_task()) # 运行次循环

以上这篇python协程之动态添加任务的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现数通设备端口使用情况监控实例
Jul 15 Python
python导出chrome书签到markdown文件的实例代码
Dec 27 Python
pandas dataframe添加表格框线输出的方法
Feb 08 Python
python协程之动态添加任务的方法
Feb 19 Python
python进程和线程用法知识点总结
May 28 Python
Python利用全连接神经网络求解MNIST问题详解
Jan 14 Python
python实现的分层随机抽样案例
Feb 25 Python
python中使用input()函数获取用户输入值方式
May 03 Python
深入浅析Python代码规范性检测
Jul 31 Python
浅谈python 类方法/静态方法
Sep 18 Python
通过Python pyecharts输出保存图片代码实例
Nov 25 Python
Flask response响应的具体使用
Jul 15 Python
Python同步遍历多个列表的示例
Feb 19 #Python
python读取txt文件并取其某一列数据的示例
Feb 19 #Python
详解Python3注释知识点
Feb 19 #Python
Python3解释器知识点总结
Feb 19 #Python
python 利用文件锁单例执行脚本的方法
Feb 19 #Python
对Python协程之异步同步的区别详解
Feb 19 #Python
在python里从协程返回一个值的示例
Feb 19 #Python
You might like
php使用递归计算文件夹大小
2014/12/24 PHP
php提高网站效率的技巧
2015/09/29 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
php实现头像上传预览功能
2017/04/27 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
2018/08/15 PHP
php数组遍历类与用法示例
2019/05/24 PHP
js特效,页面下雪的小例子
2013/06/17 Javascript
js动态创建、删除表格示例代码
2013/08/07 Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
2014/06/23 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
前端框架Vue.js构建大型应用浅析
2016/09/12 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
JavaScript事件对象event用法分析
2018/07/27 Javascript
Js逆向实现滑动验证码图片还原的示例代码
2020/03/10 Javascript
JavaScript console的使用方法实例分析
2020/04/28 Javascript
介绍Python中几个常用的类方法
2015/04/08 Python
Python实现自动发送邮件功能
2021/03/02 Python
python实现共轭梯度法
2019/07/03 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
浅谈Python中的模块
2020/06/10 Python
CSS3 input框的实现代码类似Google登录的动画效果
2020/08/04 HTML / CSS
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
计算机专业毕业生的自我评价
2013/11/18 职场文书
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
财务学生的职业生涯发展
2014/02/11 职场文书
英语国培研修感言
2014/02/13 职场文书
安全生产宣传标语
2014/06/06 职场文书
2014年保安个人工作总结
2014/11/13 职场文书
2016公司年会通知范文
2015/04/25 职场文书
2015年教师节新闻稿
2015/07/17 职场文书
2015年店长个人工作总结
2015/10/23 职场文书
送给火锅店的创意营销方案!
2019/07/08 职场文书
穷人该怎么创业?谨记以下几点
2019/07/11 职场文书
Python基础知识之变量的详解
2021/04/14 Python