Извлечь возвращаемое значение связанной со стеком функции Python Tasklet?
Эксперты без стека,
Мне удалось создать тасклеты под Stackless Python (как со стороны Stackless, так и со стороны C).
Мне кажется, что для создания тасклета в Stackless вы привязываете произвольную вызываемую функцию Python (функцию) к тасклету (а также необходимые параметры), поэтому связанный вызываемый объект будет запускаться как тасклет. Однако произвольный вызываемый объект может иметь возвращаемое значение, которое важно для вызывающего. Но мне еще предстоит найти способ получить возвращаемое значение привязанного вызываемого объекта, работающего как тасклет.
На чистом Stackless Python я вижу идиому использования, называемую Micromanaging, который оборачивает исходную функцию управляющей функцией, которая, в свою очередь, может захватывать возвращаемое значение исходной функции и сохранять его где-то для использования в каком-то другом контексте.
К сожалению, мой особый вариант использования включает создание тасклета на стороне C (C++), привязку к (потенциально блокирующему) вызываемому Python, который имеет важное возвращаемое значение, которое будет использоваться позже. Кажется, что написание такой микроуправляющей функции на стороне C не очень выполнимо, так как я не нашел способа динамически превратить функцию C в вызываемый объект PyObject (не включая инициализацию таблицы модулей и т. Д.) И используя статическое отсутствие состояния. Функция C (я бы предположил, что прототипом должен быть PyObject* (PyObject*, PyObject*)), как правило, плохая идея в мире C++.
Похоже, что Stackless C API также не содержит надлежащей функции для получения возвращаемого значения тасклета. Является ли это единственной возможностью, которую я должен написать вышеупомянутую функцию Micromanaging (может быть с состоянием) в Python, и предоставить способ для получения возвращаемого значения, сохраненного где-то (в состоянии с сохранением состояния, то есть без использования глобальных переменных)? Или могут быть другие варианты, которые я мог бы изучить?
Большое спасибо,
Lin
PS Я понимаю, что при программировании на уровне C и операционной системы возвращаемое значение функции потока имеет смысл только для кода выхода, а функции потока имеют строгий прототип функции, т.е. функции C должны соблюдать некоторые строгие правила, чтобы стать работоспособными как / нитью. И теперь мы говорим о Python:)
1 ответ
С Stackless.com:
"... Но мне еще предстоит найти способ получить возвращаемое значение привязанного вызываемого объекта, выполняемого как тасклет...."
Я не знаю, что есть один.
"... важное возвращаемое значение, которое будет использовано позже. Кажется, что написание такой микроуправляющей функции на стороне C не очень выполнимо, так как я не..."
Самый простой способ сделать это - определить код функции Python для переноса в C как строку и скомпилировать его в объект функции, который вы можете запустить как тасклет. Ниже приведен пример функции Python, часть C я оставляю вам.
например
def RunFunctionAndGetResult(chan, func, *args, **kwargs):
chan.send(func(*args, **kwargs))
Ура,
Ричард.