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
  • asp之家 网络编程 m.aspxhome.com