• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Последовательная асинхронная работа функций.

Автор Doom, 27.06.23, 23:22:38

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Doom

Доброго Всем!

Необходимо асинхронная работа функций но при этом они должны выполняться последовательно - нашел реализацию но не работает. В чем мб ошибка ?

Вариант 1

# вариант 1: работает но при этом ошибка => RuntimeError: This event loop is already running
async def snmp():
    print('start')
    await asyncio.sleep(5)
    print('end')

async def proxy():
    print('this')

async def main():
   
    await snmp()
    await proxy()

loop = asyncio.get_event_loop()
loop.create_task(main())
loop.run_forever()

print('завершено') # - почему то не выводит это сообщение

Вариант 2

# вариант 2: работает но при этом ошибка => RuntimeError: This event loop is already running
async def snmp():
    print('start')
    await asyncio.sleep(5)
    print('end')

async def proxy():
    print('this')

loop = asyncio.get_event_loop()
loop.create_task(snmp())
loop.create_task(proxy())
loop.run_forever()

print('завершено') # - почему то не выводит это сообщение

Вариант 3

# вариант 3: не работает - ошибка => RuntimeError: This event loop is already running
async def snmp():
    print('start')
    await asyncio.sleep(5)
    print('end')

async def proxy():
    print('this')

loop = asyncio.get_event_loop()
tasks = [snmp(),proxy()]
loop.run_until_complete(tasks)
# loop.run_until_complete(asyncio.wait(tasks))
loop.close()

print('завершено') # - почему то не выводит это сообщение

Вариант 4

# вариант 4: не работает - ошибка => RuntimeWarning: coroutine 'main' was never awaited  self._target(*self._args, **self._kwargs) RuntimeWarning: Enable tracemalloc to get the object allocation traceback
async def snmp():
    print('start')
    await asyncio.sleep(5)
    print('end')

async def proxy():
    print('this')

async def main():
   
    await snmp()
    await proxy()

threads = []
t = threading.Thread(target=main)
threads.append(t)
t.start()
print('завершено') # - почему то не выводит это сообщение

Вариант 5

# вариант 5: не работает - ошибка => RuntimeError: asyncio.run() cannot be called from a running event loop
async def snmp():
    print('start')
    await asyncio.sleep(5)
    print('end')

async def proxy():
    print('this')

async def main():
       
    tasks = []
    tasks.append(asyncio.create_task(snmp()))
    tasks.append(asyncio.create_task(proxy()))

    await asyncio.gather(*tasks)

asyncio.run(main())

print('завершено') # - почему то не выводит это сообщение

Python 3.8.10 x64

Doom

обновил до Python 3.11.4 x64 - пару вариантов заработали но переходить из за этого не хочется, а как до этой версии тогда пользовались?

Doom

Решение(какие то велосипедные велосипеды):

..работает без каких либо ошибок

import nest_asyncio

...
nest_asyncio.apply()
...

+ Благодарностей: 1