質問するログイン新規登録

回答編集履歴

3

コードの余分な部位を削除

2019/07/07 04:08

投稿

KSwordOfHaste
KSwordOfHaste

スコア18406

answer CHANGED
@@ -67,12 +67,6 @@
67
67
  thread.join()
68
68
 
69
69
 
70
- def main2():
71
- loop = asyncio.get_event_loop()
72
- # loop.run_until_complete(main())
73
- asyncio.run(main(), debug=True)
74
-
75
-
76
70
  if __name__ == '__main__':
77
71
  main1()
78
72
  ```

2

誤記

2019/07/07 04:08

投稿

KSwordOfHaste
KSwordOfHaste

スコア18406

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  適切な回答かどうか自信がない(asyncioの仕様経験が乏しい)のですが、自分は次のように考えました。
2
2
 
3
3
  - Tkinterはメインスレッドで動かす。
4
- run_in_executorを使ってしまうとメインスレッド以外でTkinterが実行されることになるためか、ご質問にあるとおりうまくいかないようです。メインスレッド以外でTkinterのイベントループが動くものかどうかよく調べてはいないですが・・・。よってTkinterに関する処理をasyncioのタスクとして動かすのはあきらめざるを得ないように思います。async関数の中でTkinterを呼び出しても動くことは動くでしょうが、そこで非同期I/O処理は全て止まってしまうため並行し動かしたいならasyncioを動かすスレッドとは別のスレッドで動かす必要があるように思います。
4
+ run_in_executorを使ってしまうとメインスレッド以外でTkinterが実行されることになるためか、ご質問にあるとおりうまくいかないようです。メインスレッド以外でTkinterのイベントループが動くものかどうかよく調べてはいないですが・・・。よってTkinterに関する処理をasyncioのタスクとして動かすのはあきらめざるを得ないように思います。async関数の中でTkinterを呼び出しても動くことは動くでしょうが、そこで非同期I/O処理は全て止まってしまうため並行し動かしたいならasyncioを動かすスレッドとは別のスレッドで(asyncioの枠組みとは別の世界で)動かす必要があるように思います。
5
5
 
6
6
  - 非同期I/Oはメインスレッド以外でも動くのでこちらをサブスレッドで動かすようにする。
7
7
 

1

訂正

2019/07/07 04:07

投稿

KSwordOfHaste
KSwordOfHaste

スコア18406

answer CHANGED
@@ -1,7 +1,5 @@
1
- 完全解決にってないですが・・・
1
+ 適切回答かどうか自信がない(asyncioの仕様経験が乏しい)のですが、自分は次のように考えました。
2
2
 
3
- 自分はまず次のように考えました。
4
-
5
3
  - Tkinterはメインスレッドで動かす。
6
4
  run_in_executorを使ってしまうとメインスレッド以外でTkinterが実行されることになるためか、ご質問にあるとおりうまくいかないようです。メインスレッド以外でTkinterのイベントループが動くものかどうかよく調べてはいないですが・・・。よってTkinterに関する処理をasyncioのタスクとして動かすのはあきらめざるを得ないように思います。async関数の中でTkinterを呼び出しても動くことは動くでしょうが、そこで非同期I/O処理は全て止まってしまうため並行した動かしたいならasyncioを動かすスレッドとは別のスレッドで動かす必要があるように思います。
7
5
 
@@ -11,7 +9,7 @@
11
9
  mainにてタスクの実行を(awaitなどで)待ってないので、コルーチンは生成されるものの、その実行が先に進まないままmainが終わってしまいます。
12
10
 
13
11
  - Tkinterの処理をasyncio側で待つ
14
- asyncio.Futureを作り、メインスレッド側でそのFutureにset_resultで結果を設定してやるとasyncio処理側でそのFutureを待つことで同期および結果が利用できると考えました。他にもっとよい(自然)な方法があるかも知れません・・・
12
+ asyncio.Futureを作り、メインスレッド側でそのFutureにset_resultで結果を設定してやるとasyncio処理側でそのFutureを待つことで同期および結果が利用できると考えました。他にもっとよい(自然)な方法があるかも知れません・・・
15
13
 
16
14
  main.py
17
15
  ```python