Восстановление возвращаемой величины функции Carslet Python Python Python?

StackOverflow https://stackoverflow.com/questions/3092614

Вопрос

Эксперты по штату,

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

Мне кажется, что для создания задачи в стекле без стека вы связываете произвольный Cython Callable (функция) с задачей (а также требуемые параметры), поэтому связанный вызов будет выполняться как задача. Тем не менее, произвольный выбор может действительно иметь возвратное значение, которое важно для вызывающего абонента. Но мне еще предстоит увидеть способ получить возвращаемое значение связанного обратного бега в качестве задачи.

На стороне Pure Stateless Python я вижу идиому использования, называемую микроудакой, которая оборачивает оригинальную функцию с помощью управляющей функции, которая в свою очередь мог Захватите возвращаемое значение исходной функции и сохраните ее где -нибудь для использования в каком -то другом контексте.

К сожалению, мое особое место для использования включает в себя создание Tasklet из сторон C (C ++), связывающегося с (потенциально блокирующим) Python Callable, который имеет важное значение возврата, которое будет использоваться позже. Похоже, что написание такой микроуменной функции на стороне C не очень возможна, поскольку я не нашел способ превратить функцию C в PyObject Callable динамически (не включает инициализацию таблицы модулей и т. Д.), И использование статических лиц. C Функция (я бы предположил, что прототип должен быть pyobject * (pyobject *, pyobject *)), как правило, плохая идея в мире C ++ в любом случае.

API C Stackelles C также не содержит правильную функцию для получения возвращаемого значения Tasklet. Является ли единственный вариант, который я должен написать вышеупомянутую функцию микроукладки (мог Будьте штабны) в Python и предоставьте способ извлечения возвращаемого значения, сохраненного где-то (в состоянии государственной моды, то есть не используя глобальные переменные)? Или могут быть другие варианты, которые я мог бы исследовать?

Большое тебе спасибо,

Линейный

PS Я понимаю, что при программировании уровня операционной системы возвратное значение функции потока имеет значение только для кода выхода, а функции потоков будут иметь строгий прототип функций, т.е. функции C должны соблюдать некоторые строгие правила, чтобы стать выполненным. как/поток. А теперь мы говорим о Python :)

Это было полезно?

Решение

From Cackless.com:

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

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

«... важное возвратное значение, которое будет использовано позже. Похоже, что написание такой функции микроуправления на стороне C не очень выполнимо, так как я не ...»

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

например

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

Ваше здоровье,

Ричард.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top