Получить возвращаемое значение связной функции тасклета Python без стека? - PullRequest
1 голос
/ 22 июня 2010

Stackless Experts,

Мне удалось создать тасклеты под Stackless Python (как со стороны Stackless, так и со стороны C).

Мне кажется, что для создания тасклета вБез стеков, вы привязываете произвольную вызываемую функцию (функцию) 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 Ответ

1 голос
/ 23 июня 2010

С Stackless.com:

"... Но мне еще предстоит найти способ получить возвращаемое значение привязанного вызываемого объекта, выполняемого как тасклет. ..."

Я не знаю, есть ли один.

"... важное возвращаемое значение, которое будет использоваться позже. Кажется, что написание такой функции Micromanaging на стороне C не очень выполнимо, поскольку у меня нет... "

Самый простой способ сделать это - определить код функции Python для переноса в C как строку и скомпилировать его в объект функции, который вы можете запустить как тасклет.Ниже приведен пример функции Python, часть C, которую я оставляю вам.

Например,

  def RunFunctionAndGetResult(chan, func, *args, **kwargs):
      chan.send(func(*args, **kwargs))

Приветствия,

Ричард.

...