【问题标题】:Simplest way to gracefully cancel an asyncio job in Python?在 Python 中优雅地取消异步作业的最简单方法?
【发布时间】:2021-02-24 07:39:10
【问题描述】:

我一直在玩 API,并在捕获特定字符串时调用函数。

目前,我在函数内部使用 sys.exit 来结束脚本。但是这会导致错误:

_ClientEventTask exception was never retrieved
future: <ClientEventTask state=finished event=on_message coro=<bound method MyClient.on_message of <__main__.MyClient object at 0x123b20a00>> exception=SystemExit()>

我想优雅地关闭脚本。相关代码sn-p在这里:

class MyClient(API.Client):

      async def on_message(self, message):

        if (message.channel.id == XXX): 
            dostuff(message.content)

client = MyClient()

client.run('XXX')

我尝试了很多方法,但有点卡住了。非常感谢任何帮助,谢谢!

【问题讨论】:

  • 你看过Task.cancel()吗?这篇文章可能有用:stackoverflow.com/questions/40016501/…,以及这篇文章:code.luasoftware.com/tutorials/python/asyncio-graceful-shutdown
  • 感谢这些 - 我已经查看了它们,但不幸的是,在我的代码示例中无法找到一种简单的方法来修改我的代码以实现相同的效果。我真的只有两周的时间开始使用 python 编码(自从高中的 qbasic 以来还没有真正做过任何编码!),因此对我来说学习曲线有点陡峭。虽然这是我第一次在某事上卡了半天多哈哈。

标签: python python-asyncio


【解决方案1】:

实现您想要的直接方法是将sys.exit() 替换为asyncio.get_event_loop().stop()

【讨论】:

  • 谢谢!行之有效的只是将 asyncio.get_event_loop().stop() 添加到被调用函数的末尾。将 client.run 更改为 client.start 会引发错误,因此我将其保留为 client.run。
  • @user15273025 我现在修改了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 2021-08-28
  • 1970-01-01
相关资源
最近更新 更多