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获取当前计算机cpu数量的方法
Apr 18 Python
Python解决N阶台阶走法问题的方法分析
Dec 28 Python
Python爬虫设置代理IP的方法(爬虫技巧)
Mar 04 Python
pandas 两列时间相减换算为秒的方法
Apr 20 Python
对python 读取线的shp文件实例详解
Dec 22 Python
pandas.DataFrame的pivot()和unstack()实现行转列
Jul 06 Python
Python 中pandas索引切片读取数据缺失数据处理问题
Oct 09 Python
用Python去除图像的黑色或白色背景实例
Dec 12 Python
Python MySQL 日期时间格式化作为参数的操作
Mar 02 Python
Python3操作读写CSV文件使用包过程解析
Apr 10 Python
python 实现socket服务端并发的四种方式
Dec 14 Python
深度学习tensorflow基础mnist
Apr 14 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 特殊字符处理函数
2008/09/05 PHP
php页面跳转代码 输入网址跳转到你定义的页面
2013/03/28 PHP
如何用PHP实现插入排序?
2013/04/10 PHP
探讨多键值cookie(php中cookie存取数组)的详解
2013/06/06 PHP
解析php做推送服务端实现ios消息推送
2013/07/01 PHP
PHP实现设计模式中的抽象工厂模式详解
2014/10/11 PHP
php简单防盗链实现方法
2015/07/29 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
IE7提供XMLHttpRequest对象为兼容
2007/03/08 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
2015/10/12 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
2015/10/21 Javascript
浅谈js键盘事件全面控制
2016/12/01 Javascript
微信小程序-获得用户输入内容
2017/02/13 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
2017/03/04 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
2017/08/28 Javascript
微信小程序开发背景图显示功能
2018/08/08 Javascript
微信小程序分包加载代码实现方法详解
2019/09/23 Javascript
原生js实现贪食蛇小游戏的思路详解
2019/11/26 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
[53:10]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs VG 第一场
2018/04/11 DOTA
Python删除空文件和空文件夹的方法
2015/07/14 Python
利用Python获取赶集网招聘信息前篇
2016/04/18 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
基于Python实现扑克牌面试题
2019/12/11 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
2020/05/15 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
深入浅析HTML5中的article和section的区别
2018/05/15 HTML / CSS
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
某IT外企面试题-二分法求方程!看看大家的C++功底
2015/07/04 面试题
目标责任书格式
2014/07/28 职场文书
出国留学英文自荐信
2015/03/25 职场文书
淘宝客服专员岗位职责
2015/04/07 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
钱学森观后感
2015/06/04 职场文书
行政处罚告知书
2015/07/01 职场文书
Python基础 括号()[]{}的详解
2021/11/07 Python