python在协程中增加任务实例操作
作者:小妮浅浅 时间:2023-02-17 22:57:48
1、添加一个任务
task2 = visit_url('http://another.com', 3)
asynicio.run(task2)
2、这 2 个程序一共消耗 5s 左右的时间。并没有发挥并发编程的优势
import asyncio
import time
async def visit_url(url, response_time):
"""访问 url"""
await asyncio.sleep(response_time)
return f"访问{url}, 已得到返回结果"
async def run_task():
"""收集子任务"""
task = visit_url('http://wangzhen.com', 2)
task_2 = visit_url('http://another', 3)
await asyncio.run(task)
await asyncio.run(task_2)
asyncio.run(run_task())
print(f"消耗时间:{time.perf_counter() - start_time}")
3、如果是并发编程,这个程序只需要消耗 3s,也就是task2的等待时间。
要想使用并发编程形式,需要把上面的代码改一下。asyncio.gather 会创建 2 个子任务,当出现 await 的时候,程序会在这 2 个子任务之间进行调度。
async def run_task():
"""收集子任务"""
task = visit_url('http://wangzhen.com', 2)
task_2 = visit_url('http://another', 3)
await asynicio.gather(task1, task2)
实例扩展:
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()) # 运行次循环
来源:https://www.py.cn/jishu/jichu/27141.html
标签:python,协程
0
投稿
猜你喜欢
如何动态在文档中加入<script></script>写入大段js?
2010-07-02 13:17:00
Python实现快速排序的方法详解
2022-08-29 13:08:35
vue之webpack -v报错解决方案总结
2024-05-09 09:51:23
python基于tkinter制作下班倒计时工具
2022-09-17 00:43:36
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
2024-04-22 22:13:35
SQL SERVER 2008 CTE生成结点的FullPath
2024-01-16 08:04:29
Go语言空结构体详解
2024-04-30 10:07:44
使用Python机器学习降低静态日志噪声
2021-11-09 23:48:57
利用PyQt5中QLabel组件实现亚克力磨砂效果
2023-12-13 18:33:04
opencv实现图像缩放效果
2022-10-24 04:52:28
Vue3 defineExpose要在方法声明定义以后使用的教程
2024-05-21 10:30:03
利用PyInstaller将python程序.py转为.exe的方法详解
2021-07-09 16:41:51
.Net行为型设计模式之迭代器模式(Iterator)
2024-06-05 09:27:47
ubuntu下在docker中安装mysql5.6 的方法
2024-01-23 08:35:30
浅谈慢SQL优化之索引的作用
2024-01-24 20:31:54
Python标准库之sqlite3使用实例
2023-08-12 18:44:05
浅谈String类型如何转换为time类型存进数据库
2024-01-26 18:37:39
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2024-01-19 16:38:39
JavaScript解释型模版
2009-10-19 23:12:00
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
2023-08-08 01:11:57