【问题标题】:Unable to schedule anything in asyncio. (Python 3.7.x)无法在 asyncio 中安排任何内容。 (Python 3.7.x)
【发布时间】:2020-11-11 14:04:14
【问题描述】:

我目前正在使用 python 3.7.x 开发 asyncio,不确定确切的版本,现在我正在尝试安排一个任务。而且我无法获得输出,即使永远运行这个东西。这是我目前拥有的代码

import asyncio

async def print_now():
  print("Hi there")

loop = asyncio.get_event_loop()
loop.call_later(print_now())
loop.run_until_complete(asyncio.sleep(1))

这会产生以下错误:

Traceback (most recent call last):
  File "D:\Coding\python\async\main.py", line 7, in <module>
    loop.call_later(print_now())
TypeError: call_later() missing 1 required positional argument: 'callback'

call_later() 中的回电是print_now 我只试过print_nowprint_now() 我也尝试过使用loop.run_forever() 而不是loop.run_until_complete() ,到目前为止我什么也没得到

有时我没有得到任何输出或其他错误。

【问题讨论】:

标签: python python-3.x python-asyncio


【解决方案1】:

首先,是的,您缺少 delay 参数。第一个应该是延迟,而第二个应该是回调(docs)。

loop.call_later(delay, callback, *args, context=None)

其次,回调应该是一个函数。你传递的是print_now(),它将评估为None。你可能会发现

'NoneType' 对象不可调用

因此,您需要将print_now(不带括号)作为回调传递。这样,您传递的是一个函数,而不是其应用程序的结果。


第三,async 函数应该是awaited on。您的场景似乎不需要这个,所以只需删除 async 关键字。

当你调用一个等待函数时,你创建了一个新的协程对象。函数内部的代码将不会运行,直到您在函数上等待或将其作为任务运行

来自this post。你可能想看看

【讨论】:

  • 哦,不敢相信我错过了那部分。估计我没注意。谢谢。
  • 请注意,在问题中定义print_now 时,print_now() 不会评估为无,而是评估为新的协程对象。它不会改变任何东西,它仍然无法调用,只是错误会有所不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
相关资源
最近更新 更多