Генераторы Python; Как на самом деле работает выход из? [дубликат]Python

Программы на Python
Ответить
Anonymous
 Генераторы Python; Как на самом деле работает выход из? [дубликат]

Сообщение Anonymous »

Я начинаю изучать асинхронность с помощью генераторов, потому что пытаюсь глубже понять сопрограммы. У меня есть код:

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

import time

def sleep(seconds):
start_time = time.time()
while time.time() - start_time < seconds:
yield

def task1():
while True:
print('Task 1')
yield from sleep(3)

event_loop = [task1()]
while True:
for task in event_loop:
next(task)
Когда я запускаю его, я вижу, что строка «Задача 1» печатается каждые 3 секунды, что для меня неожиданно. Похоже, что выход из сна(3) вызывает генератор сна() не так, как next(sleep(3)), когда он переходит к следующему выходу из текущего состояния, а как обычный функция: ждет, пока она полностью завершит свой код.
Итак, я вижу следующее: запускается Task1(), печатает «Задачу 1», затем выходит из режима сна (3), что означает, что генератор спит (3) работает с самого начала до StopIteration. Я ожидал следующего: запускается задача 1(), печатает «Задачу 1», а затем переходит из режима сна (3), что означает, что сон() проверяет свое временное условие, понимает, что 3 секунды еще не прошло, и возвращает управление обратно в задачу 1(), которая возвращает элемент управления в цикл for. Цикл for снова вызывает Task1(), Task1() печатает «Задачу 1» и переходит из режима сна(3), который снова проверяет время, понимает, что 3 секунды еще не прошло и так далее...
Итак, вопрос в том, прав ли я, когда понимаю это так: выход из сна(3) вызывает генератор сна() таким образом, когда он не доходит до следующего выход и возвращает управление задаче Task1(), но ОстановитьИтерацию?

Подробнее здесь: https://stackoverflow.com/questions/792 ... ally-works
Ответить

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

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

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

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

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