Python中如何创建和运行异步任务详解

目录
  • 正文
  • 1. 什么是异步任务
  • 2. 如何创建任务
    • 2.1. 高级 API
    • 2.2. 低级 API
  • 3. 任务何时运行?

正文

您可以从 asyncio 程序中的协程创建任务对象。任务提供独立调度和运行的协程的句柄,并允许查询、取消任务,以及稍后检索结果和异常。异步事件循环管理任务。因此,所有协程都成为事件循环中的任务并作为任务进行管理。

让我们仔细看看 asyncio 任务。

1. 什么是异步任务

异步任务是一个调度并独立运行 asyncio 协程的对象。它提供了一个调度协程的句柄,asyncio 程序可以查询并使用它来与协程交互。

任务是从协程创建的。它需要一个协程对象,包装协程,安排它执行,并提供与之交互的方法。任务独立执行。这意味着它被安排在 asyncio 事件循环中,并且无论创建它的协程中发生了什么,它都会执行。这与直接执行协程不同,后者调用者必须等待它完成。

asyncio.Task 类扩展了 asyncio.Future 类,一个实例是可等待的。Future 是一个较低级别的类,代表最终会到达的结果。扩展 Future 类的类通常被称为 Future-like。

因为异步任务是可等待的,这意味着协程可以使用 await 表达式等待任务完成。

...
# wait for a task to be done
await task

现在我们知道什么是 asyncio 任务,让我们看看如何创建一个。

2. 如何创建任务

使用提供的协程实例创建任务。回想一下协程是使用 async def 表达式定义的,看起来像一个函数。

# define a coroutine
async def task_coroutine():
	# ...

任务只能在协程中创建和调度。创建和调度任务有两种主要方式,它们是:

  • 使用高级 API 创建任务(首选)
  • 使用低级 API 创建任务

2.1. 高级 API

可以使用 asyncio.create_task() 函数创建任务。asyncio.create_task() 函数接受一个协程实例和一个可选的任务名称,并返回一个 asyncio.Task 实例。

...
# create a coroutine
coro = task_coroutine()
# create a task from a coroutine
task = asyncio.create_task(coro)

这可以通过在一行中使用复合语句来实现。

...
# create a task from a coroutine
task = asyncio.create_task(task_coroutine())

这将做几件事:

  • 将协程包装在异步任务实例中。
  • 安排任务在当前事件循环中执行。
  • 返回一个任务实例

任务实例可以被丢弃,通过方法与之交互,并由协程等待。这是从 asyncio 程序中的协程创建任务的首选方法。

2.2. 低级 API

也可以使用较低级别的 asyncio API 从协程创建任务。

第一种方法是使用 asyncio.ensure_future() 函数。此函数采用任务、未来或类似未来的对象,例如协程,以及可选的用于调度它的循环。如果没有提供循环,它将被安排在当前事件循环中。

如果为这个函数提供了协程,它会为我们包装在一个实例中,然后返回。

...
# create and schedule the task
task = asyncio.ensure_future(task_coroutine())

我们可以用来创建和调度任务的另一个低级函数是 loop.create_task() 方法。此函数需要访问特定的事件循环,在该事件循环中将协程作为任务执行。

我们可以通过 asyncio.get_event_loop() 函数获取 asyncio 程序中当前事件循环的实例。然后可以使用它来调用 create_task() 方法来创建一个 Task 实例并安排它执行。

...
# get the current event loop
loop = asyncio.get_event_loop()
# create and schedule the task
task = loop.create_task(task_coroutine())

3. 任务何时运行?

创建任务后的一个常见问题是它什么时候运行?

虽然我们可以通过 create_task() 函数调度协程作为任务独立运行,但它可能不会立即运行。事实上,直到事件循环有机会运行,任务才会执行。

直到所有其他协程都没有运行并且轮到任务运行时才会发生这种情况。

例如,如果我们有一个 asyncio 程序,其中有一个创建和调度任务的协程,则调度的任务将不会运行,直到创建任务的调用协程被挂起。

如果调用协程选择休眠,选择等待另一个协程或任务,或者选择等待已安排的新任务,则可能会发生这种情况。

...
# create a task from a coroutine
task = asyncio.create_task(task_coroutine())
# await the task, allowing it to run
await task

现在我们知道什么是任务以及如何安排它们。

以上就是Python中如何创建和运行异步任务详解的详细内容,更多关于Python创建运行异步任务的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python 异步之如何获取当前和正在运行任务详解

    目录 正文 1. 如何获取当前任务 2. 如何获取所有任务 正文 我们可以反省在 asyncio 事件循环中运行的任务.这可以通过为当前运行的任务和所有正在运行的任务获取一个 asyncio.Task 对象来实现. 1. 如何获取当前任务 我们可以通过 asyncio.current_task() 函数获取当前任务.此函数将为当前正在运行的任务返回一个任务对象. ... # get the current task task = asyncio.current_task() 传递给 asynci

  • Python 异步之在 Asyncio中如何运行阻塞任务详解

    目录 正文 1. 阻塞任务 2. 如何运行阻塞任务 3. 实例 正文 阻塞任务是阻止当前线程继续进行的任务. 如果在 asyncio 程序中执行阻塞任务,它会停止整个事件循环,从而阻止任何其他协程继续进行. 我们可以通过 asyncio.to_thread() 和 loop.run_in_executor() 函数在 asyncio 程序中异步运行阻塞调用. 1. 阻塞任务 asyncio的重点是异步编程和非阻塞IO.然而,我们经常需要在 asyncio 应用程序中执行阻塞函数调用. 这可能有很

  • Python 异步之如何启动获取事件循环

    目录 1. 什么是 Asyncio 事件循环 2. 如何启动和获取事件循环 3. 什么是事件循环对象 4. 为什么要访问事件循环 1. 什么是 Asyncio 事件循环 asyncio 程序的核心是事件循环.在本节中,我们将花点时间看一下 asyncio 事件循环 事件循环是用于在单个线程中执行协程的环境.事件循环是异步程序的核心. 它做了很多事情,例如: 执行协程. 执行回调. 执行网络输入/输出. 运行子进程. 事件循环是一种常见的设计模式,并且由于在 JavaScript 中的使用而在最近

  • 如何使用Python异步之上下文管理器

    目录 正文 1. 什么是异步上下文管理器 1.1. Context Manager 1.2. Asynchronous Context Manager 2. 如何使用异步上下文管理器 2.1. 定义 2.2. 使用 3. 异步上下文管理器和“异步”示例 正文 上下文管理器是一种 Python 构造,它提供了一个类似 try-finally 的环境,具有一致的接口和方便的语法,例如通过“with”表达. 它通常与资源一起使用,确保在我们完成资源后始终关闭或释放资源,无论资源的使用是成功还是因异常而

  • Python 异步等待任务集合

    目录 正文 1. 什么是 asyncio.wait() 2. 如何使用 asyncio.wait() 3. 等待所有任务的示例 正文 我们可以通过 asyncio.wait() 函数等待异步任务完成.可以等待不同的条件,例如所有任务完成.第一个任务完成以及第一个任务因异常而失败. 让我们仔细看看. 1. 什么是 asyncio.wait() asyncio.wait() 函数可用于等待一组异步任务完成.回想一下,asyncio 任务是包装协程的 asyncio.Task 类的一个实例.它允许独立

  • Python 异步如何使用等待有时间限制协程

    目录 正文 1. 什么是 Asyncio wait_for() 2. 如何使用 Asyncio wait_for() 3. 带有超时的 Asyncio wait_for() 示例 正文 我们可以使用 asyncio.wait_for() 函数等待 asyncio 任务或协程超时完成.如果在任务完成之前超时已过,任务将被取消. 1. 什么是 Asyncio wait_for() asyncio.wait_for() 函数允许调用者等待 asyncio 任务或协程超时完成.如果没有指定超时,wait

  • Python异步之迭代器如何使用详解

    目录 正文 1. 什么是异步迭代器 1.1. Iterators 1.2. Asynchronous Iterators 2. 什么是“async for”循环? 3. 如何使用异步迭代器 4. 异步迭代器示例 正文 迭代是 Python 中的基本操作.我们可以迭代列表.字符串和所有其他结构. Asyncio 允许我们开发异步迭代器.我们可以通过定义一个实现 aiter() 和 anext() 方法的对象来在 asyncio 程序中创建和使用异步迭代器. 1. 什么是异步迭代器 异步迭代器是一个

  • Python中如何创建和运行异步任务详解

    目录 正文 1. 什么是异步任务 2. 如何创建任务 2.1. 高级 API 2.2. 低级 API 3. 任务何时运行? 正文 您可以从 asyncio 程序中的协程创建任务对象.任务提供独立调度和运行的协程的句柄,并允许查询.取消任务,以及稍后检索结果和异常.异步事件循环管理任务.因此,所有协程都成为事件循环中的任务并作为任务进行管理. 让我们仔细看看 asyncio 任务. 1. 什么是异步任务 异步任务是一个调度并独立运行 asyncio 协程的对象.它提供了一个调度协程的句柄,asyn

  • 对python中数据集划分函数StratifiedShuffleSplit的使用详解

    文章开始先讲下交叉验证,这个概念同样适用于这个划分函数 1.交叉验证(Cross-validation) 交叉验证是指在给定的建模样本中,拿出其中的大部分样本进行模型训练,生成模型,留小部分样本用刚建立的模型进行预测,并求这小部分样本的预测误差,记录它们的平方加和.这个过程一直进行,直到所有的样本都被预测了一次而且仅被预测一次,比较每组的预测误差,选取误差最小的那一组作为训练模型. 下图所示 2.StratifiedShuffleSplit函数的使用 官方文档 用法: from sklearn.

  • Python中Pyspider爬虫框架的基本使用详解

    1.pyspider介绍 一个国人编写的强大的网络爬虫系统并带有强大的WebUI.采用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器. 用Python编写脚本 功能强大的WebUI,包含脚本编辑器,任务监视器,项目管理器和结果查看器 MySQL,MongoDB,Redis,SQLite,Elasticsearch; PostgreSQL与SQLAlchemy作为数据库后端 RabbitMQ,Beanstalk,Redis

  • Python中更优雅的日志记录方案详解

    目录 常见使用 loguru 安装 基本使用 详细使用 在 Python 中,一般情况下我们可能直接用自带的 logging 模块来记录日志,包括我之前的时候也是一样.在使用时我们需要配置一些 Handler.Formatter 来进行一些处理,比如把日志输出到不同的位置,或者设置一个不同的输出格式,或者设置日志分块和备份.但其实个人感觉 logging 用起来其实并不是那么好用,其实主要还是配置较为繁琐. 常见使用 首先看看 logging 常见的解决方案吧,我一般会配置输出到文件.控制台和

  • Python 中 Virtualenv 和 pip 的简单用法详解

    本文介绍了Python 中 Virtualenv 和 pip 的简单用法详解,分享给大家,具体如下: 0X00 安装环境 我们在 Python 开发和学习过程中需要用到各种库,然后在各个不同的项目和作品里可能用的版本还不一样,正因为有这种问题的存在才催生了virtualenv的诞生.virtualenv 可以在电脑上创建一个虚拟环境,可以针对每一个项目创建一个虚拟环境,这样就不用担心各个不同的项目用不同版本的库的时候出现的冲突了. 下面的内容只适用于 Linux/OSX,未经 Windows 环

  • python中函数总结之装饰器闭包详解

    1.前言 函数也是一个对象,从而可以增加属性,使用句点来表示属性. 如果内部函数的定义包含了在外部函数中定义的对象的引用(外部对象可以是在外部函数之外),那么内部函数被称之为闭包. 2.装饰器 装饰器就是包装原来的函数,从而在不需要修改原来代码的基础之上,可以做更多的事情. 装饰器语法如下: @deco2 @deco1 def func(arg1,arg2...): pass 这个表示了有两个装饰器的函数,那么表示的含义为:func = deco2(deco1(func)) 无参装饰器语法如下:

  • Python中set与frozenset方法和区别详解

    set(可变集合)与frozenset(不可变集合)的区别: set无序排序且不重复,是可变的,有add(),remove()等方法.既然是可变的,所以它不存在哈希值.基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交集), difference(差集)和sysmmetric difference(对称差集)等数学运算. sets 支持 x in set, len(set),和 for x in set.作为一个无序的集合,sets不记录元素位

  • 对numpy的array和python中自带的list之间相互转化详解

    a=([3.234,34,3.777,6.33]) a为python的list类型 将a转化为numpy的array: np.array(a) array([ 3.234, 34. , 3.777, 6.33 ]) 将a转化为python的list a.tolist() 以上这篇对numpy的array和python中自带的list之间相互转化详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们. 您可能感兴趣的文章: Python创建二维数组实例(关于list的一个

  • 对python中的 os.mkdir和os.mkdirs详解

    创建目录 在Python中可以使用os.mkdir()函数创建目录(创建一级目录). 其原型如下所示: os.mkdir(path) 其参数path 为要创建目录的路径. 例如要在D盘下创建hello的目录 >>> import os >>> os.mkdir('d:\hello') 可以使用os.makedirs()函数创建多级目录. 其原型如下所示: os.makedirs(path) 其参数path 为要创建目录的路径. 如在D盘下创建books的目录,books

  • 对python中GUI,Label和Button的实例详解

    如下所示: #coding=utf-8 import Tkinter top=Tkinter.Tk() #400x300:代表初始化时主窗口的大小,300,100分别代表窗口的初始化位置 #x:为小写的x top.geometry('400x300+300+100') #创建一个文本框,里面内容为"hello world" lab=Tkinter.Label(top,text='hello world') #布局方式 lab.pack() #创建一个按钮 button=Tkinter.

随机推荐