asyncioで何もスケジュールできません。(Python 3.7.x)

Nov 11 2020

私は現在、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_now、代わりにprint_now()使用してみloop.run_forever()ましたがloop.run_until_complete() 、これまでのところ何も得られませんでした

出力がないか、別のエラーが表示されることがあります。

回答

2 Paul Nov 11 2020 at 21:17

まず、はい、delay引数がありません。最初のものは遅延であり、2番目のものはコールバックであると想定されています(docs)。

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

第二に、コールバックは関数であると想定されています。あなたが渡しているのは、print_now()どちらが評価されるかNoneです。あなたはそれを見つけるかもしれません

'NoneType'オブジェクトは呼び出せません

したがってprint_now、コールバックとして(括弧なしで)渡す必要があります。このようにして、アプリケーションの結果ではなく関数を渡します。


第三に、async機能はawait編集されることになっています。あなたのシナリオはそれを必要としないようです、それでただasyncキーワードを落としてください。

待機可能な関数を呼び出すと、新しいコルーチンオブジェクトが作成されます。関数内のコードは、関数を待つか、タスクとして実行するまで実行されません。

この投稿から。あなたはチェックアウトしたいかもしれません