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 相关文章推荐
Mac 上切换Python多版本
Jun 17 Python
Python实现获取照片拍摄日期并重命名的方法
Sep 30 Python
python爬取亚马逊书籍信息代码分享
Dec 09 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
Jun 23 Python
Python3.6日志Logging模块简单用法示例
Jun 14 Python
使用sklearn之LabelEncoder将Label标准化的方法
Jul 11 Python
python调用外部程序的实操步骤
Mar 04 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
May 03 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
Feb 29 Python
python中yield的用法详解
Jan 13 Python
Python用tkinter实现自定义记事本的方法详解
Mar 31 Python
基于Python编写一个监控CPU的应用系统
Jun 25 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
用PHPdig打造属于你自己的Google[图文教程]
2007/02/14 PHP
php面向对象全攻略 (十六) 对象的串行化
2009/09/30 PHP
php设计模式  Command(命令模式)
2011/06/17 PHP
php获取根域名方法汇总
2014/10/28 PHP
PHP生成不重复标识符的方法
2014/11/21 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
js滚动条多种样式,推荐
2007/02/05 Javascript
执行iframe中的javascript方法
2008/10/07 Javascript
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
JavaScript解析URL参数示例代码
2013/08/12 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
p5.js入门教程之平滑过渡(Easing)
2018/03/16 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
js数据类型转换与流程控制操作实例分析
2019/12/18 Javascript
用Python代码来绘制彭罗斯点阵的教程
2015/04/03 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
Python利用turtle库绘制彩虹代码示例
2017/12/20 Python
python字符串替换re.sub()方法解析
2019/09/18 Python
Django实现将views.py中的数据传递到前端html页面,并展示
2020/03/16 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
Python 虚拟环境工作原理解析
2020/12/24 Python
CSS3 @keyframes简单动画实现
2018/02/24 HTML / CSS
Douglas意大利官网:购买香水和化妆品
2020/05/27 全球购物
乌克兰鞋类购物网站:Eobuv.com.ua
2020/11/28 全球购物
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
教师节寄语2015
2015/03/23 职场文书
博士论文答辩开场白
2015/06/01 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL