Реализация Python без стека

Мне очень нравится функциональность Stackless Python, и я искал способ эмулировать его синтаксис, используя при этом стандартный интерпретатор Python 3. Статья Алекса Дж. Шампандара в блоге разработчиков игр заставила его выглядеть как будто библиотека greenlet может предоставить эту функциональность. Я немного изменил его код, но лучшей импровизированной оболочкой тасклета, которую я смог придумать, был класс, содержащий гринлет внутри переменной, как таковой:

class tasklet(): 
        def __init__(self,function=None,*variables):
                global _scheduled
                self.greenlet = greenlet.greenlet(function,None)
                self.functioncall = function # Redundant backup
                self.variables = variables
                _scheduled.append(self)
                self.blocked = False

Затем функция эмулирует планирование Stackless, передавая переменные в гринлет при вызове его метода switch().

Пока это работает, но я хотел бы иметь возможность вызывать тасклеты в исходном синтаксисе Stackless, например. tasklet(function)(*args), в отличие от текущего синтаксиса tasklet(function,*args). Я не уверен, где искать в документации, чтобы узнать, как это сделать. Возможно ли это вообще, или это часть изменений Stackless в интерпретаторе?


person Humble Penguin    schedule 28.07.2013    source источник
comment
Уже существуют реализации Stackless API на основе гринлета. Я не даю ссылки, так как у меня нет репутации, и когда я пытаюсь поделиться исследованиями, я получаю ошибки, отклоняющие сообщения. Гораздо меньше потраченного времени, если я скажу, что просто погуглил.   -  person user2063430    schedule 02.09.2013


Ответы (1)


Согласно этой статье от 08 января 2010 г. ( с фиксированными ссылками):

Stackless Python — это расширенная версия языка Python (и его эталонная реализация CPython). Новые функции включают облегченные сопрограммы (называемые тасклетами), коммуникационные примитивы, использующие передачу сообщений (называемые каналами), ручное и/или автоматическое планирование сопрограмм, без использования вызовов функций Python стека C и сериализацию сопрограмм (для перезагрузки в другом процессе). Stackless Python не мог быть реализован как модуль расширения Python — пришлось исправлять ядро ​​компилятора и интерпретатора CPython.

greenlet — это модуль расширения для CPython, предоставляющий сопрограммы и низкоуровневое (явное) планирование. Наиболее важным преимуществом greenlet перед Stackless Python является то, что greenlet может быть реализован как модуль расширения Python, поэтому для использования greenlet не нужно перекомпилировать весь интерпретатор Python. Недостатки гринлета включают скорость (Stackless Python может быть на 10%, 35% или 900% быстрее, в зависимости от рабочего процесса); возможные утечки памяти, если сопрограммы ссылаются друг на друга; и что предоставляемая функциональность является низкоуровневой (т. е. только ручное планирование сопрограмм, без передачи сообщений).

greenstackless, модуль Python, который я недавно разработал, предоставляет большую часть (высокоуровневого) API Stackless Python с использованием greenlet, поэтому он устраняет недостаток greenlet, заключающийся в том, что он низкоуровневый. См. исходный код и некоторые тесты (последние со сложными краеугольными случаями). Обратите внимание, что хотя greenstackless немного оптимизирован, он может быть намного медленнее, чем Stackless Python, а также не устраняет утечки памяти. Таким образом, использование greenstackless в производственных средах не рекомендуется; но его можно использовать как временную замену Stackless Python, если замена интерпретатора Python невозможна.

Некоторое другое программное обеспечение, которое эмулирует Stackless с помощью гринлета:

Concurrence: не поддерживает stackless.main, тасклет .next, tasklet.prev, tasklet.insert, tasklet.remove, stackless.schedule_remove не отправляет исключения должным образом. (Из-за отсутствия этих функций он не проходит модульный тест, описанный выше.)

PyPy: не поддерживает stackless.main , tasklet.next, tasklet.prev не проходит описанный выше модульный тест.

person Cees Timmerman    schedule 12.05.2014