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 import自定义模块方法
Feb 12 Python
用Python代码来绘制彭罗斯点阵的教程
Apr 03 Python
Python中处理时间的几种方法小结
Apr 09 Python
python实现的简单窗口倒计时界面实例
May 05 Python
详解Python编程中包的概念与管理
Oct 16 Python
实例讲解Python中global语句下全局变量的值的修改
Jun 16 Python
Centos Python2 升级到Python3的简单实现
Jun 21 Python
深入浅析Python中join 和 split详解(推荐)
Jun 30 Python
pygame实现烟雨蒙蒙下彩虹雨
Nov 11 Python
Python3.9.1中使用split()的处理方法(推荐)
Feb 07 Python
python - asyncio异步编程
Apr 06 Python
Django REST framework 限流功能的使用
Jun 24 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/02/13 PHP
PDO防注入原理分析以及注意事项
2015/02/25 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
js实现的常用的左侧导航效果
2013/10/17 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
基于Vue2.0的分页组件
2017/03/16 Javascript
在一般处理程序(ashx)中弹出js提示语
2017/08/16 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
2018/08/24 Javascript
详解React native fetch遇到的坑
2018/08/30 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
vue实现滑动超出指定距离回顶部功能
2019/07/31 Javascript
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
vue fetch中的.then()的正确使用方法
2020/04/17 Javascript
Python3.0与2.X版本的区别实例分析
2014/08/25 Python
更换Django默认的模板引擎为jinja2的实现方法
2018/05/28 Python
Python正则表达式指南 推荐
2018/10/09 Python
Python实现高斯函数的三维显示方法
2018/12/29 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
wxPython绘图模块wxPyPlot实现数据可视化
2019/11/19 Python
python 一维二维插值实例
2020/04/22 Python
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
新秀丽拉杆箱美国官方网站:Samsonite美国
2016/07/25 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
建筑工地文明标语
2014/10/09 职场文书
组织生活会表态发言材料
2014/10/17 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
简爱读书笔记
2015/06/26 职场文书
初中思品教学反思
2016/02/20 职场文书
pyqt5打包成exe可执行文件的方法
2021/05/14 Python