Разве Python тасклеты не нарушают правила "GOTO"?

Я провел огромное исследование в Google о тасклетах Stackless Python. Каждый источник упоминает это как поток

stackless.com: Microthreads: тасклеты обертывают функции, позволяющие запускать их как microthreads.

disinterest.orgv: Тасклеты - Легкие темы

Но тасклеты не совпадают. Они выполняют часть за частью кода.

Код как это:

def function(n):
   print n
   print n
   stackless.schedule()

stackless.tasklet(function)(3)
stackless.tasklet(function)(10)
stackless.run()

Будет печатать

3
3
10
10

Тасклет выполняет код до тех пор, пока не встретит stackless.schedule(), затем он выполнит следующий тасклет с начала или с места последней паузы.

Каждый программист знает золотое правило "нет GOTO". Мои вопросы:

Как это отличается от GOTO?
Каковы преимущества использования тасклетов, если они не выполняются параллельно?
Почему каждый источник упоминает их как альтернативу потоков, если они на самом деле не являются потоками?

2 ответа

Решение

Чем он отличается от goto?

Это отличается от goto тем, что вы не указываете, куда вы собираетесь. Подавая тасклет (вызов stackless.schedule()), все, что вы говорите, это "я закончил сейчас; вы можете вернуться ко мне позже" вместо "начать выполнение из строки n файла x". Совет "goto is bad" вытекает из того факта, что он позволяет вам писать код для спагетти, где невозможно выполнить выполнение вашей программы. Тасклеты (или сопрограммы), с другой стороны, намного лучше в этом отношении, потому что вы знаете, что каждый тасклет будет работать до конца.

Каковы преимущества использования тасклетов, если они не выполняются параллельно?

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

Почему каждый источник упоминает их как альтернативу потоков, если они на самом деле не являются потоками?

Они являются альтернативой потоков, если вы можете отказаться от параллелизма, чтобы снизить издержки. Они по-прежнему являются потоками, поскольку они по-прежнему допускают несколько одновременных путей выполнения, даже если они не являются строго параллельными.

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

def Eat():
   while True:
        do_something()
        stackless.schedule()
def Play():
   while True:
        do_another_thing()
        stackless.schedule()

def Sleep():
    while True:
        do_something_else()
        stackless.schedule()

stackless.tasklet(Eat)()
stackless.tasklet(Play)()
stackless.tasklet(Sleep)()

это по сути одноядерный поток, где каждый поток решает, когда он собирается передать управление другой ожидающей задаче

это очень похоже на то, как операционная система в реальном времени реализует планирование задач

Другие вопросы по тегам