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 相关文章推荐
下载给定网页上图片的方法
Feb 18 Python
Python函数可变参数定义及其参数传递方式实例详解
May 25 Python
使用python检测主机存活端口及检查存活主机
Oct 12 Python
利用python提取wav文件的mfcc方法
Jan 09 Python
在python里协程使用同步锁Lock的实例
Feb 19 Python
python把ipynb文件转换成pdf文件过程详解
Jul 09 Python
Django 开发环境配置过程详解
Jul 18 Python
Django 开发调试工具 Django-debug-toolbar使用详解
Jul 23 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
Feb 27 Python
部署Django到阿里云服务器教程示例
Jun 03 Python
python2和python3哪个使用率高
Jun 23 Python
用python对excel查重
Dec 07 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
WAR3重制版DOTA 5V5初体验
2020/04/09 DOTA
php 生成饼图 三维饼图
2009/09/28 PHP
php动态生成缩略图并输出显示的方法
2015/04/20 PHP
基于jQuery的表格操作插件
2010/04/22 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
jQuery实现伪分页的方法分享
2016/02/17 Javascript
浅谈JS原型对象和原型链
2016/03/02 Javascript
基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
2016/08/29 Javascript
AngularJs bootstrap搭载前台框架——js控制部分
2016/09/01 Javascript
js数组去重的hash方法
2016/12/22 Javascript
js 获取json数组里面数组的长度实例
2017/10/31 Javascript
Vue iview-admin框架二级菜单改为三级菜单的方法
2018/07/03 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
wxPython使用系统剪切板的方法
2015/06/16 Python
剖析Python的Twisted框架的核心特性
2016/05/25 Python
Flask框架的学习指南之开发环境搭建
2016/11/20 Python
Django数据库操作的实例(增删改查)
2017/09/04 Python
利用Python实现Shp格式向GeoJSON的转换方法
2019/07/09 Python
200行python代码实现2048游戏
2019/07/17 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
Python字典深浅拷贝与循环方式方法详解
2020/02/09 Python
Python paramiko使用方法代码汇总
2020/11/20 Python
详解css3自定义滚动条样式写法
2017/12/25 HTML / CSS
HTML5 placeholder(空白提示)属性介绍
2013/08/07 HTML / CSS
菲律宾旅游网站:Expedia菲律宾
2017/10/11 全球购物
我未来的职业规划范文
2014/01/11 职场文书
五分钟演讲稿
2014/04/30 职场文书
小学教育见习报告
2014/10/31 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
元宵节寄语大全
2015/02/27 职场文书
表彰大会新闻稿
2015/07/17 职场文书
mysql联合索引的使用规则
2021/06/23 MySQL
Minikube搭建Kubernetes集群
2022/03/31 Servers