iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python异步之怎么保护任务免于取消
  • 731
分享到

Python异步之怎么保护任务免于取消

2023-07-05 14:07:52 731人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要讲解了“python异步之怎么保护任务免于取消”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python异步之怎么保护任务免于取消”吧!Asyncio 任务可以通过调用它们的 c

这篇文章主要讲解了“python异步之怎么保护任务免于取消”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python异步之怎么保护任务免于取消”吧!

Asyncio 任务可以通过调用它们的 cancel() 方法来取消。我们可以通过将任务包装在对 asyncio.shield() 的调用中来保护任务不被取消。

1. 什么是 Asyncio shield()

asyncio.shield() 函数在 Future 中包装了一个可等待对象,它将吸收要取消的请求。

这意味着被屏蔽的未来可以传递给可能尝试取消它的任务,并且取消请求看起来像是成功的,除了被屏蔽的任务或协程将继续运行。

它可能在 asyncio 程序中很有用,其中某些任务可以取消,但其他任务(可能具有更高优先级)则不能。

它也可能在某些任务可以安全取消的程序中很有用,例如那些在设计时考虑了 asyncio 的任务,而其他任务则不能安全终止,因此必须避免取消。

现在我们知道了 asyncio.shield() 是什么,让我们看看如何使用它。

2. 如何使用 Asyncio shield()

asyncio.shield() 函数将保护另一个任务或协程不被取消。它以一个可等待对象作为参数并返回一个 asyncio.Future 对象。

然后可以直接等待 Future 对象或将其传递给另一个任务或协程。

...# shield a task from cancellationshielded = asyncio.shield(task)# await the shielded taskawait shielded

返回的 Future 可以通过调用 cancel() 方法取消。

如果内部任务正在运行,请求将被报告为成功。

...# cancel a shielded taskwas_canceld = shielded.cancel()

任何等待 Future 对象的协程都会引发 asyncio.CancelledError,这可能需要处理。

...try:# await the shielded taskawait asyncio.shield(task)except asyncio.CancelledError:# ...

重要的是,对 Future 对象的取消请求不会传播到内部任务。这意味着取消请求被护盾吸收了。

...# create a tasktask = asyncio.create_task(coro())# create a shieldshield = asyncio.shield(task)# cancel the shield (does not cancel the task)shield.cancel()

如果协程被提供给 asyncio.shield() 函数,它将被包装在 asyncio.Task() 中并立即调度。

这意味着不需要等待屏蔽来让内部协程运行。

如果被屏蔽的任务被取消,取消请求将向上传播到屏蔽,屏蔽也将被取消。

...# create a tasktask = asyncio.create_task(coro())# create a shieldshield = asyncio.shield(task)# cancel the task (also cancels the shield)task.cancel()

现在我们知道如何使用 asyncio.shield() 函数,让我们看一些有效的例子。

3. 示例

我们可以探索如何使用 asyncio.shield() 来保护任务不被取消。

在这个例子中,我们定义了一个简单的协程任务,它接受一个整数参数,休眠一秒钟,然后返回参数。然后可以创建协程并将其安排为任务。

我们可以定义第二个协程,它接受一个任务,休眠几分之一秒,然后取消提供的任务。

在主协程中,我们可以屏蔽第一个任务,然后将其传递给第二个任务,然后等待被屏蔽的任务。

期望是屏蔽将被取消并保持内部任务完好无损。取消将中断主协程。我们可以在程序结束时检查内部任务的状态,我们希望它已经正常完成,而不管屏蔽上的取消请求如何。

# SuperFastPython.com# example of using asyncio shield to protect a task from cancellationimport asyncio# define a simple asynchronousasync def simple_task(number):    # block for a moment    await asyncio.sleep(1)    # return the argument    return number# cancel the given task after a momentasync def cancel_task(task):    # block for a moment    await asyncio.sleep(0.2)    # cancel the task    was_cancelled = task.cancel()    print(f'cancelled: {was_cancelled}')# define a simple coroutineasync def main():    # create the coroutine    coro = simple_task(1)    # create a task    task = asyncio.create_task(coro)    # created the shielded task    shielded = asyncio.shield(task)    # create the task to cancel the previous task    asyncio.create_task(cancel_task(shielded))    # handle cancellation    try:        # await the shielded task        result = await shielded        # report the result        print(f'>Got: {result}')    except asyncio.CancelledError:        print('shielded was cancelled')    # wait a moment    await asyncio.sleep(1)    # report the details of the tasks    print(f'shielded: {shielded}')    print(f'task: {task}')# startasyncio.run(main())

运行示例首先创建 main() 协程并将其用作应用程序的入口点。创建任务协程,然后将其包装并安排在任务中。然后该任务就不会被取消。

然后将屏蔽的任务传递给 cancel_task() 协程,该协程包装在任务中并进行调度。主协程然后等待受保护的任务,该任务需要 CancelledError 异常。

任务运行片刻然后休眠。取消任务运行片刻,休眠,恢复然后取消屏蔽任务。取消请求报告它已成功。

这会在受保护的 Future 中引发 CancelledError 异常,但不会在内部任务中引发。

main() 协程恢复并响应 CancelledError 异常,报告一条消息。然后它会睡一会儿。任务恢复、完成并返回一个值。

最后,main() 协程恢复,并报告被屏蔽的未来和内部任务的状态。我们可以看到屏蔽的未来被标记为已取消,而内部任务被标记为正常完成并提供返回值。

此示例突出显示了如何使用防护罩来成功保护内部任务不被取消。

cancelled: Trueshielded was cancelledshielded: <Future cancelled>task: <Task finished name='Task-2' coro=<simple_task() done, defined at ...> result=1>

感谢各位的阅读,以上就是“Python异步之怎么保护任务免于取消”的内容了,经过本文的学习后,相信大家对Python异步之怎么保护任务免于取消这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Python异步之怎么保护任务免于取消

本文链接: https://www.lsjlt.com/news/352698.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python异步之怎么保护任务免于取消
    这篇文章主要讲解了“Python异步之怎么保护任务免于取消”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python异步之怎么保护任务免于取消”吧!Asyncio 任务可以通过调用它们的 c...
    99+
    2023-07-05
  • Python异步之如何保护任务免于取消详解
    目录正文1. 什么是 Asyncio shield()2. 如何使用 Asyncio shield()3. 示例正文 Asyncio 任务可以通过调用它们的 cancel() 方法...
    99+
    2023-03-22
    Python 保护任务免于取消 Python 异步
  • Python异步之怎么获取当前和正在运行任务
    正文我们可以反省在 asyncio 事件循环中运行的任务。这可以通过为当前运行的任务和所有正在运行的任务获取一个 asyncio.Task 对象来实现。1. 如何获取当前任务我们可以通过 asyncio.current_task() 函数获...
    99+
    2023-05-14
    Python
  • python异步任务怎么实现
    在Python中,可以使用协程(Coroutine)和异步IO来实现异步任务。首先,需要使用`async`关键字定义一个协程函数(C...
    99+
    2023-09-22
    python
  • Python异步之在Asyncio中怎么运行阻塞任务
    今天小编给大家分享一下Python异步之在Asyncio中怎么运行阻塞任务的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。正文...
    99+
    2023-07-05
  • Python异步之如何获取当前和正在运行任务
    今天小编给大家分享一下Python异步之如何获取当前和正在运行任务的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。正文我们可以...
    99+
    2023-07-06
  • Python异步等待任务怎么使用
    今天小编给大家分享一下Python异步等待任务怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。正文我们可以通过 asy...
    99+
    2023-07-05
  • Python 异步之如何获取当前和正在运行任务详解
    目录正文1. 如何获取当前任务2. 如何获取所有任务正文 我们可以反省在 asyncio 事件循环中运行的任务。这可以通过为当前运行的任务和所有正在运行的任务获取一个 asynci...
    99+
    2023-03-22
    Python 异步获取当前运行任务 Python 异步
  • PHP怎么实现异步定时多任务消息推送
    这篇“PHP怎么实现异步定时多任务消息推送”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PHP怎么实现异步定时多任务消息推送...
    99+
    2023-07-06
  • Python中怎么创建和运行异步任务
    1. 什么是异步任务异步任务是一个调度并独立运行 asyncio 协程的对象。它提供了一个调度协程的句柄,asyncio 程序可以查询并使用它来与协程交互。任务是从协程创建的。它需要一个协程对象,包装协程,安排它执行,并提供与之交互的方法。...
    99+
    2023-05-14
    Python
  • 怎么使用Java多线程Future获取异步任务
    本篇内容主要讲解“怎么使用Java多线程Future获取异步任务”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Java多线程Future获取异步任务”吧!Runnable的局限性在前文中...
    99+
    2023-07-05
  • Python异步之怎么启动获取事件循环
    这篇文章主要介绍“Python异步之怎么启动获取事件循环”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python异步之怎么启动获取事件循环”文章能帮助大家解决问题。1. 什么是 Asyncio 事...
    99+
    2023-07-05
  • Django celery怎么实现异步任务操作并在后台运行守护进程
    这篇文章主要介绍了Django celery怎么实现异步任务操作并在后台运行守护进程,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。没废话,直接上代码。环境说明:python3...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作