morisita
@morisita

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

asyncioのエラー処理

解決したいこと

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()
0

1Answer

どんなエラーなのか分かりませんが、エラーを try-except で捕捉できるなら、相手のタスクを停止させる等の後処理を行うのはどうでしょうか。

0Like

Comments

  1. @morisita

    Questioner

    ありがとうございます。投稿したコードを実行すると
    print(10/i)
    のところでfunc2()がエラーを起こしますが、func1()は走り続けます。
    これを止めてほしいのです。

  2. print(10/i)

    i=0のときに、0除算エラーになりますね。それを対策すべきでは?

  3. 綺麗とは言えませんが、以下のコードでどうでしょうか。

    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()
    
  4. @morisita

    Questioner

    ありがとうございます!!まさにしたいことができています。
    errorが出た後でもその後に操作ができるのは面白いですね

Your answer might help someone💌