どんなエラーなのか分かりませんが、エラーを try-except で捕捉できるなら、相手のタスクを停止させる等の後処理を行うのはどうでしょうか。
Like!
asyncioで繰り返し動作をしている二つのタスクのうち片方でエラーが出たとき、もう一つのタスクも止まってほしいのですが、何か方法あるでしょうか?よろしくお願いいたします
import asyncio
async def func1():
while True:
await asyncio.sleep(9)
print(datetime.datetime.now().replace(microsecond=0),'func1')
async def func2():
i=5
while True:
await asyncio.sleep(5)
print(10/i)
i=i-1
print(datetime.datetime.now().replace(microsecond=0),'func2')
async def main():
task1=asyncio.create_task(func1())
task2=asyncio.create_task(func2())
await asyncio.gather(task1,task2)
await main()
どんなエラーなのか分かりませんが、エラーを try-except で捕捉できるなら、相手のタスクを停止させる等の後処理を行うのはどうでしょうか。
@morisita
Questionerありがとうございます。投稿したコードを実行すると
print(10/i)
のところでfunc2()がエラーを起こしますが、func1()は走り続けます。
これを止めてほしいのです。
print(10/i)
i=0のときに、0除算エラーになりますね。それを対策すべきでは?
綺麗とは言えませんが、以下のコードでどうでしょうか。
import asyncio
done = True
async def func1():
while done:
await asyncio.sleep(9)
print(datetime.datetime.now().replace(microsecond=0),'func1')
async def func2():
global done
i=5
while done:
await asyncio.sleep(5)
try:
print(10/i)
except:
done = False
i-=1
print(datetime.datetime.now().replace(microsecond=0),'func2')
async def main():
task1=asyncio.create_task(func1())
task2=asyncio.create_task(func2())
await asyncio.gather(task1,task2)
await main()
@morisita
Questionerありがとうございます!!まさにしたいことができています。
errorが出た後でもその後に操作ができるのは面白いですね