回答編集履歴

1

コード追加

2022/02/01 08:27

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -4,6 +4,55 @@
4
4
 
5
5
  タスク内で return される値を扱うには、
6
6
  task.add_done_callback メソッドで、タスク完了時に呼び出す関数を登録します。
7
+
8
+ ```python
9
+ import asyncio
10
+ from types import SimpleNamespace
11
+
12
+
13
+ async def main():
14
+ shared = SimpleNamespace(
15
+ var="おはよう",
16
+ )
17
+
18
+ task1 = asyncio.create_task(coro_1())
19
+
20
+ def done(task):
21
+ shared.var = task.result()
22
+
23
+ task1.add_done_callback(done)
24
+
25
+ while True:
26
+ task2 = asyncio.create_task(coro_2(shared))
27
+
28
+ await task2
29
+
30
+ task3 = asyncio.create_task(coro_3())
31
+
32
+ await task3
33
+
34
+
35
+ async def coro_1():
36
+ await asyncio.sleep(3)
37
+ return 'こんばんは'
38
+
39
+
40
+ async def coro_2(shared):
41
+ await asyncio.sleep(1)
42
+ print(shared.var)
43
+
44
+
45
+ async def coro_3():
46
+ await asyncio.sleep(1)
47
+ print('こんにちは')
48
+
49
+
50
+ try:
51
+ asyncio.run(main())
52
+ except KeyboardInterrupt:
53
+ pass
54
+
55
+ ```
7
56
 
8
57
  > 質問文: (おはよう→こんにちは→おはよう→こんにちは→こんばんは)のようにprintされると考えていました。
9
58
  > コメント: 私が想定していたのはおはよう→こんにちは→こんばんは→こんにちは→こんばんは→...というようにvarにはawaitの処理が終わるまでは「おはよう」、終わってからは「こんばんは」が代入されるというものでした。
@@ -24,3 +73,4 @@
24
73
  main関数側のループで扱うのではなく、各コルーチン内で独立したループを持つ方法をお勧めします。
25
74
  「〇〇秒後に実行」であれば、簡易的には`loop.call_later` を使う方法もあります。
26
75
 
76
+