質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1031閲覧

spyderコンソールと外部ターミナルとでコルーチンの実行結果が異なる

old.exe

総合スコア23

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/11/03 01:27

前提

コルーチンの単体テストをコンソールでやると以下のようなエラーが発生しました。外部ターミナルではちゃんと動作しているようです。エラーの原因はプログラムにあるのでしょうか、それともspyder側の不具合なのでしょうか。回答よろしくお願いします。

実現したいこと

  • エラーの原因を明らかにする

発生している問題・エラーメッセージ

spyderでの実行結果

RuntimeError: asyncio.run() cannot be called from a running event loop

外部ターミナルでの実行結果

0 150536.25519100984

該当のソースコード

python

1cities_data = read_tspfile() 2population = [] # [[経路],[経路],[経路]...[経路]] 3cities = [] # Cityオブジェクトを入れるリスト 4CITIES_N = len(cities_data) # 都市数 5 6 7class City: 8 def __init__(self,num,X,Y): 9 self.num = num 10 self.X = X 11 self.Y = Y 12 13 14class Route: 15 def __init__(self): 16 self.distance = 0 17 18 # 経路を作成(重複なしのランダム) 19 self.citynums = random.sample(list(range(CITIES_N)),CITIES_N) 20 21 22async def calc_distance(route_obj): 23 """ citynumsリストの各都市間の距離の総和を求める """ 24 route_obj.distance = 0 25 for i,num in enumerate(route_obj.citynums): 26 """ 27 1つ前の都市との距離を計算 28 i=0のとき、i-1は最後の都市(最後の都市からスタートへの距離) 29 """ 30 route_obj.distance += math.dist((cities[num].X, 31 cities[num].Y), 32 (cities[route_obj.citynums[i-1]].X, 33 cities[route_obj.citynums[i-1]].Y)) 34 35 36 37 38# citiesに読み込んだ座標を持つCityオブジェクトを入れる 39for i in range(CITIES_N): 40 cities.append(City(cities_data[i][0], 41 cities_data[i][1], 42 cities_data[i][2])) # num,X,Yの順 43 44 45# populationに個体を追加 46for i in range(2): 47 population.append(Route()) 48 49 50async def main(): 51 print(population[0].distance) 52 await calc_distance(population[0]) 53 print(population[0].distance) 54 55asyncio.run(main())

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

IDE やエディタ等での実行の場合は、実行方法の実装により制限を受ける場合があります。

例えば、デバッグ情報等を GUI に表示するために、IDE側で新プロセスを立ち上げて
その中でユーザのコードを読み込んで独自に実行している場合等が該当します。

「不具合」というよりは、実装上の制限にあたるかもしれません。
Issue報告されてますが、Spyder側では不具合修正みたいな対応されず、
利用者側が設定等で各自対応します。

問題点
Jupyter/IPythonコンソール上での実行でしたら
IPythonのカーネルが asyncio のイベントループを使っているので
その中で実行されるコードで、同一スレッド上で 新しく asyncio.run を使えないというものです。
(asyncioの実装制限で、イベントループ内でイベントループを立ち上げられない)

対策(どれかひとつ)

  • Jupyter/IPythonコンソールで実行したい場合

 ⇛ nest_asyncio や unasync 等の問題を回避するための外部ライブラリを利用

  • 外部システムターミナルから実行されるように設定する。

 (この場合、IPythonコンソールは使わない)

  • 別スレッドで asyncio.run を使う
  • 追記: asyncio を使い、イベントループが実行中かどうかを判別してコードを分岐する

 既存のイベントループにタスク追加 create_task

投稿2022/11/03 08:23

編集2022/11/03 08:31
teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問