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中的多线程实例教程
Aug 27 Python
python实现的DES加密算法和3DES加密算法实例
Jun 03 Python
分享Python字符串关键点
Dec 13 Python
Python Nose框架编写测试用例方法
Oct 26 Python
基于Python中单例模式的几种实现方式及优化详解
Jan 09 Python
对python .txt文件读取及数据处理方法总结
Apr 23 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
Dec 03 Python
利用python中的matplotlib打印混淆矩阵实例
Jun 16 Python
如何用Anaconda搭建虚拟环境并创建Django项目
Aug 02 Python
Python通过yagmail实现发送邮件代码解析
Oct 27 Python
python 用opencv实现霍夫线变换
Nov 27 Python
教你用python实现一个无界面的小型图书管理系统
May 21 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
SMARTY学习手记
2007/01/04 PHP
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
php简单实现发送带附件的邮件
2015/06/10 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
php的RSA加密解密算法原理与用法分析
2020/01/23 PHP
利用location.hash实现跨域iframe自适应
2010/05/04 Javascript
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
原生JavaScript制作微博发布面板效果
2016/03/11 Javascript
js 判断各种数据类型的简单方法(推荐)
2016/08/29 Javascript
js判断价格,必须为数字且不能为负数的实现方法
2016/10/07 Javascript
jstl中判断list中是否包含某个值的简单方法
2016/10/14 Javascript
jquery表单提交带错误信息提示效果
2017/03/09 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
2017/03/09 Javascript
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
微信小程序三级联动选择器使用方法
2020/05/19 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
vue项目实现github在线预览功能
2018/06/20 Javascript
深入理解Vue router的部分高级用法
2018/08/15 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
2019/10/28 jQuery
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
python简单实现获取当前时间
2016/08/27 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
2018/10/09 Python
python用post访问restful服务接口的方法
2018/12/07 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
PYTHON如何读取和写入EXCEL里面的数据
2019/10/28 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
详解python程序中的多任务
2020/09/16 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
2021/02/20 Python
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
银行竞聘上岗演讲稿
2014/09/12 职场文书
居委会工作总结2015
2015/05/18 职场文书