Python Asyncio: RuntimeEror: этот цикл событий уже запущен - PullRequest
1 голос
/ 12 апреля 2019

Я работаю над модулем ayncio и у меня возникают проблемы в завершающей программе . Я запускаю свою программу в терминале и Ctrl + C не работает, чтобы остановить запущенную программу. Однако, если я закрываю терминал и пытаюсь снова запустить программу, я получаю эту проблему:

INFO:root:In main
ERROR:root:This event loop is already running

Ниже приведен пример кода для понимания.

# all_tasks.py

import asyncio
import logging
# module imports
import settings

#configure logging into a file
logging.basicConfig(filename=settings.LOG_FILENAME,level=logging.DEBUG)


class AsyncTest(object):

    async def taskOne(self):
        while True:
            print("Task One") # Print is just an example, I am doing lot of stuff inside.
            await asyncio.sleep(60)

    async def taskTwo(self):
        while True:
            print("Task Two") # Print is just an example, I am doing lot of stuff inside.
            await asyncio.sleep(60) 

    async def main(self):
        try:
            loop = asyncio.get_event_loop()
                tasks = [
                        asyncio.ensure_future(self.taskOne()),
                        asyncio.ensure_future(self.taskTwo()),
                        ]
            loop.run_until_complete(asyncio.wait(tasks))
        except RuntimeError as error:
            logging.info("In main")
            logging.error(error)

if __name__ == '__main__':
    asynctest = AsyncTest()
    asyncio.run(asynctest.main())

Config: Windows 10, python 3.7.0

File Name: all_tasks.py

Command: python all_tasks.py

Любая помощь очень ценится. Спасибо

1 Ответ

1 голос
/ 12 апреля 2019

asyncio.run создает и запускает цикл обработки событий. Вы не должны создавать и запускать его, особенно внутри сопрограммы (функция определена с async def). В сопрограмме вы должны только await для чего-то.

Измените код соответствующим образом:

# ...

    async def main(self):
        tasks = [
            asyncio.ensure_future(self.taskOne()),
            asyncio.ensure_future(self.taskTwo()),
        ]
        await asyncio.wait(tasks)

if __name__ == '__main__':
    asynctest = AsyncTest()
    asyncio.run(asynctest.main())

Это сработает.

...