var = task1
で おはよう
が入っている変数が上書きされてしまうので、おはよう
がprintされることはありませんね。
(おはよう→こんにちは→おはよう→こんにちは→こんばんは)のようにprintされると考えていました。
おはよう→こんにちは→こんばんは→おはよう→こんにちは→こんばんは の順ではないですか?
それならこれでどうでしょうか?
py
1import asyncio
2
3
4async def main():
5 var = 'おはよう'
6
7 while True:
8 task1 = asyncio.create_task(coro_1())
9 task2 = asyncio.create_task(coro_2(var))
10 task3 = asyncio.create_task(coro_3())
11 print(await task1)
12 await task2
13 await task3
14
15
16async def coro_1():
17 await asyncio.sleep(3)
18 return 'こんばんは'
19
20
21async def coro_2(var):
22 await asyncio.sleep(1)
23 print(var)
24
25
26async def coro_3():
27 await asyncio.sleep(1)
28 print('こんにちは')
29
30
31try:
32 asyncio.run(main())
33except KeyboardInterrupt:
34 pass
こうすれば最初の1回だけ 'おはよう'
が表示されます。
py
1import asyncio
2
3
4async def main():
5 var = 'おはよう'
6
7 while True:
8 task1 = asyncio.create_task(coro_1())
9 task2 = asyncio.create_task(coro_2(var))
10 task3 = asyncio.create_task(coro_3())
11 var = await task1
12 await task2
13 await task3
14
15
16async def coro_1():
17 await asyncio.sleep(3)
18 return 'こんばんは'
19
20
21async def coro_2(var):
22 await asyncio.sleep(1)
23 print(var)
24
25
26async def coro_3():
27 await asyncio.sleep(1)
28 print('こんにちは')
29
30
31try:
32 asyncio.run(main())
33except KeyboardInterrupt:
34 pass
Taskが終わっていたらawaitするようにしたら望みの動作になりますか?
py
1import asyncio
2
3
4async def main():
5 var = 'おはよう'
6 task1 = task2 = task3 = None
7
8 while True:
9 if task1 is None:
10 task1 = asyncio.create_task(coro_1())
11 if task2 is None:
12 task2 = asyncio.create_task(coro_2(var))
13 if task3 is None:
14 task3 = asyncio.create_task(coro_3())
15 if task1.done():
16 var = await task1
17 task1 = None
18 if task2.done():
19 await task2
20 task2 = None
21 if task3.done():
22 await task3
23 task3 = None
24 await asyncio.sleep(0.1)
25
26
27async def coro_1():
28 await asyncio.sleep(3)
29 return 'こんばんは'
30
31
32async def coro_2(var):
33 await asyncio.sleep(1)
34 print(var)
35
36
37async def coro_3():
38 await asyncio.sleep(1)
39 print('こんにちは')
40
41
42try:
43 asyncio.run(main())
44except KeyboardInterrupt:
45 pass
少し簡略化
py
1import asyncio
2
3
4async def main():
5 var = 'おはよう'
6 task1 = None
7
8 while True:
9 if task1 is None:
10 task1 = asyncio.create_task(coro_1())
11 task2 = asyncio.create_task(coro_2(var))
12 task3 = asyncio.create_task(coro_3())
13 if task1.done():
14 var = await task1
15 task1 = None
16 await task2
17 await task3
18
19
20async def coro_1():
21 await asyncio.sleep(3)
22 return 'こんばんは'
23
24
25async def coro_2(var):
26 await asyncio.sleep(1)
27 print(var)
28
29
30async def coro_3():
31 await asyncio.sleep(1)
32 print('こんにちは')
33
34
35try:
36 asyncio.run(main())
37except KeyboardInterrupt:
38 pass
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/02/03 13:38
2022/02/03 13:59
2022/02/04 12:20