Asyncio .create_task() не запускает переданную функциюPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Asyncio .create_task() не запускает переданную функцию

Сообщение Anonymous »

Я пытаюсь создать программу, которая выполняет несколько операций, связанных с таймером, в Python, и мне нужно сделать так, чтобы Asyncio создавал задачу (не дожидаясь ее), вызывая другую функцию с помощью asyncio.get_event_loop().create_task( timer_function(my_parameters)), я использовал это раньше в другом проекте, и он работал нормально, однако в этом случае он не вызывает timer_function(), как должно, и я подозреваю, что это происходит потому, что это внутри циклов или что-то связанное со структурой проекта. На данный момент я не смог найти ничего, что работало, только с помощью await удалось вызвать функцию, но в итоге она не работала параллельно. Структура проекта следующая:

Код: Выделить всё

async def timer_function(my_parameters):

print('Timer_Function called')

# Do stuff with the parameters

asyncio.sleep(time_based_on_those_parameters)

# Finish doing some other things

# Note: final() doesn't need to be async, I only made it so
# to try and test some fixes
async def final(parameters):

# Do stuff

while True:  # This part loops forever every minute

# Do stuff

for i in range(my_range):

if some_condition_a:

asyncio.get_event_loop().create_task(timer_function(my_parameters))

print('Condition A met')

if some_condition_b:

asyncio.get_event_loop().create_task(timer_function(some_different_parameters)

print('Condition B met')

# Do some other stuff

sleep(60)

После запуска кода все, что будет напечатано при выполнении этих условий, будет

Код: Выделить всё

>>> Condition met
но я ожидал увидеть и то, и другое

Код: Выделить всё

>>> Condition met
>>> Timer function called
Затем я помещаю await перед частью create_task, и все, что печатается в этот момент,

Код: Выделить всё

>>> Timer function called
И только тогда, когда таймер истечет и сделает то, что ему нужно, будет напечатано >>> Условие выполнено
. Есть ли способ изменить эту структуру, чтобы разместить Asyncio или что-то еще, что я мог бы попробовать?
EDIT: я нашел обходной путь, используя многопоточность вместо асинхронно. Код теперь такой:

Код: Выделить всё

def timer_function(my_parameters): # Sync method now

print('Timer_Function called')

# Do stuff with the parameters

sleep(time_based_on_those_parameters) # No longer asyncio.sleep()

# Finish doing some other things

def final(parameters):

# Do stuff

threads = []

while True:  # This part loops forever every minute

# Do stuff

for i in range(my_range):

if some_condition_a:

t = threading.Thread(target=timer_function, args=(my_parameters))
threads.append(t)
t.start()

print('Condition A met')

if some_condition_b:

t = threading.Thread(target=timer_function, args=(my_parameters))
threads.append(t)
t.start()

print('Condition B met')

# Do some other stuff

sleep(60)

Теперь это работает так, как задумано, поэтому мне больше не нужно исправлять эту проблему, однако, если кто-нибудь знает, почему Asyncio не делает этого в этой структуре, дайте мне знать, как у кого-то может возникнуть такая же проблема в будущем. (Я проверил другой проект, который я сделал, и

Код: Выделить всё

asyncio.get_event_loop().create_task(timer_function(my_parameters))
можно вызывать без ожидания, разница в том, что в этом случае он находится внутри цикла while и цикла for, а в том случае, когда это сработало, его просто вызывали один раз в прослушивателе событий)

Подробнее здесь: https://stackoverflow.com/questions/689 ... -passed-in
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Asyncio .create_task() не запускает переданную функцию
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Есть ли разница между ожиданием asyncio.Task и asyncio.Task.result()?
    Anonymous » » в форуме Python
    0 Ответы
    49 Просмотры
    Последнее сообщение Anonymous
  • Есть ли разница между ожиданием asyncio.Task и asyncio.Task.result()?
    Anonymous » » в форуме Python
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Почему вызов неоднозначен между Task.Run(Func) и Task.Run(Func) при передаче имени метода
    Anonymous » » в форуме C#
    0 Ответы
    103 Просмотры
    Последнее сообщение Anonymous
  • Получить функцию, переданную как имя аргумента внутри другой функции
    Гость » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Гость

Вернуться в «Python»