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实现字符串格式化的方法小结
Feb 20 Python
Python数据结构之哈夫曼树定义与使用方法示例
Apr 22 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
May 29 Python
Python自动采集微信联系人的实现示例
Feb 28 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
Apr 14 Python
python如何输出反斜杠
Jun 18 Python
python3 简单实现组合设计模式
Jul 02 Python
Python命名空间及作用域原理实例解析
Aug 12 Python
基于Python实现体育彩票选号器功能代码实例
Sep 16 Python
python3 sqlite3限制条件查询的操作
Apr 07 Python
python利用while求100内的整数和方式
Nov 07 Python
python3 字符串str和bytes相互转换
Mar 23 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知识收集
2012/08/20 PHP
php去掉文件前几行的方法
2015/07/29 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
jQuery实现弹出窗口中切换登录与注册表单
2015/06/05 Javascript
jQuery实现鼠标点击弹出渐变层的方法
2015/07/09 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
2016/08/05 Javascript
nodejs入门教程六:express模块用法示例
2017/04/24 NodeJs
node.js基础知识小结
2018/02/26 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
微信小程序如何修改本地缓存key中单个数据的详解
2019/04/26 Javascript
layui layer select 选择被遮挡的解决方法
2019/09/21 Javascript
原生JS实现天气预报
2020/06/16 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
vue element实现表格合并行数据
2020/11/30 Vue.js
python基础教程之常用运算符
2014/08/29 Python
python实现图片变亮或者变暗的方法
2015/06/01 Python
python3爬虫获取html内容及各属性值的方法
2018/12/17 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
2020/02/25 Python
python环境下安装opencv库的方法
2020/03/05 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
Aurora London官网:奢华、负担得起的皮革手袋
2020/08/01 全球购物
音乐教学随笔感言
2014/02/19 职场文书
个人公开承诺书
2014/03/28 职场文书
调查研究项目计划书
2014/04/29 职场文书
2014年学校财务工作总结
2014/12/06 职场文书
满月酒邀请函
2015/01/30 职场文书
结婚纪念日感言
2015/08/01 职场文书
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android