web-dev-qa-db-ja.com

RuntimeError:asyncio.run()を実行しているイベントループから呼び出すことはできません

私はWebSocketsクライアントのAsyncioについて学びようとしています。コードのすべての部分では、次のエラーが発生します。

RuntimeError:asyncio.run()を実行しているイベントループから呼び出すことはできません

私は最も簡単なコードを試してみました、そしてそれは常にそのランタイムエラーを与えます。私は再び完全なアナコンダディストリビューションをインストールし、問題があるかもしれないものを見つけることができません。

私はSpyder 3.3.3を使ってPython 3.7.3)を使っています

機能するべきコードの例:

import asyncio

async def main():
    print('hello')
    await asyncio.sleep(1)
    print('world')

asyncio.run(main())
 _

エラーメッセージ:

File "C:\Users\jmart\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 786, in runfile
  execfile(filename, namespace)
File "C:\Users\jmart\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
  exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/jmart/Documents/asynk2.py", line 8, in <module>
  asyncio.run(main())
File "C:\Users\jmart\Anaconda3\lib\asyncio\runners.py", line 34, in run
  "asyncio.run() cannot be called from a running event loop")
RuntimeError: asyncio.run() cannot be called from a running event loop
 _
8
Javier Martin

問題起源

Spyderはそれ自身のイベントループを実行します

_print(asyncio.get_running_loop().is_running()) 
Returns: True
_

しかし、スレッドごとに許可されています

別のasyncioイベントループが同じスレッド内で実行されているときに呼び出されですく

だからこそ、新しいイベントループを作成しようとするのは
[。asyncio.run(main())エラーを与えます:
RuntimeError: asyncio.run() cannot be called from a running event loop

解決策

Est_asyncioと竜巻で既に提案されているものを除いて

  1. 新しいタスクを作成することによって既存のSpyderスレッドイベントループに添付
_import asyncio

async def main():
    print('Hello world!')

asyncio.create_task(main())
_
  1. 自分のイベントループを実行できるようにする新しいスレッドを作成する(外部端末に実行することによって)。
    [。]トップメニュー実行 - > ファイルごとの設定... - > の実行の実行外部システム端子enter image description here

これで、コードは新しい端末とworksで実行されます

_import asyncio

async def main():
    print('Hello world!')
asyncio.run(main())

_
0
Stepan