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实现scrapy定时执行爬虫
Mar 04 Python
Python基于TCP实现会聊天的小机器人功能示例
Apr 09 Python
详解Django之auth模块(用户认证)
Apr 17 Python
浅谈python中拼接路径os.path.join斜杠的问题
Oct 23 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
Jan 18 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
Mar 23 Python
python3 sleep 延时秒 毫秒实例
May 04 Python
Selenium python时间控件输入问题解决方案
Jul 22 Python
详解使用python爬取抖音app视频(appium可以操控手机)
Jan 26 Python
Python下载商品数据并连接数据库且保存数据
Mar 31 Python
Python+SeaTable实现计算两个日期间的工作日天数
Jul 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
PHP 类商品秒杀计时实现代码
2010/05/05 PHP
探讨GDFONTPATH能否被winxp下的php支持
2013/06/21 PHP
PHP中使用Imagick实现各种图片效果实例
2015/01/21 PHP
php实现中文转数字
2016/02/18 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
jquery实现具有收缩功能的垂直导航菜单
2016/02/16 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
原生javascript实现图片放大镜效果
2017/01/18 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
2017/09/07 Javascript
基于JavaScript中标识符的命名规则介绍
2018/01/06 Javascript
微信小程序数据存储与取值详解
2018/01/30 Javascript
微信小程序数据分析之自定义分析的实现
2018/08/17 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
Python读取键盘输入的2种方法
2015/06/16 Python
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
python根据txt文本批量创建文件夹
2020/12/08 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
2019/03/23 Python
pymysql模块的使用(增删改查)详解
2019/09/09 Python
python-web根据元素属性进行定位的方法
2019/12/13 Python
Python中无限循环需要什么条件
2020/05/27 Python
数以千计的折扣工业产品:ESE Direct
2018/05/20 全球购物
北美领先的智能产品购物网站:Wellbots
2018/06/11 全球购物
LN-CC英国:伦敦时尚生活的缩影
2019/09/01 全球购物
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
如何使用PHP session
2015/04/21 面试题
如何让Java程序执行效率更高
2014/06/25 面试题
禁毒宣传工作方案
2014/05/23 职场文书
毕业证明书
2015/06/19 职场文书
品德与社会教学反思
2016/02/24 职场文书
入党申请书怎么写?
2019/06/21 职场文书
详解TS数字分隔符和更严格的类属性检查
2021/05/06 Javascript
MySQL为数据表建立索引的原则详解
2022/03/03 MySQL
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js
Hive导入csv文件示例
2022/06/25 数据库
win10如何快速切换窗口 win10切换窗口快捷键分享
2022/07/23 数码科技