Плагины иногда делают свое дело.
Конечно, вы могли бы использовать достаточно mootools, чтобы получить его модель класса / наследования. С реализацией document.id
«режима совместимости» в 1.2.3 вы можете съесть свой торт и съесть его тоже (я думаю - не сделал это сам.)
Не имея понятия, что такое SWIG, я все равно попытаюсь ответить :)
Используйте что-то вроде этого, чтобы выпустить / получить GIL:
class GILReleaser {
GILReleaser() : save(PyEval_SaveThread()) {}
~GILReleaser() {
PyEval_RestoreThread(save);
}
PyThreadState* save;
};
И в кодовом блоке по вашему выбору используйте RAII для выпуска / получить GIL:
{
GILReleaser releaser;
// ... Do stuff ...
}
Вы можете использовать тот же вызов API, что и для C. Без разницы. Включите "python.h" и вызовите соответствующую функцию.
Также посмотрите, нет ли в SWIG карты типов или чего-то еще, чтобы указать, что GIL-код не удерживается для конкретной функции.
Настоящая проблема в том, что SWIG плохо документирован (я видел подсказки по использованию журнала изменений для поиска;)).
Хорошо, я обнаружил, что могу выполнять встроенные функции в SWIG и использовать макросы для выпуска / получения GIL, это выглядит так:
%inline %{
void wrappedFunction(OriginalObject *o, <parameters>) {
Py_BEGIN_ALLOW_THREADS
o->originalFunction(<parameters>);
Py_END_ALLOW_THREADS
}
%}
Эта функция отсутствует в исходном C ++, но доступна в модуле python. Это (почти) именно то, что я хотел. (я бы хотел обернуть оригинальный метод, как это делает декоратор python)
но доступен в модуле python. Это (почти) именно то, что я хотел. (я бы хотел обернуть оригинальный метод, как это делает декоратор python) но доступен в модуле python. Это (почти) именно то, что я хотел. (я бы хотел обернуть оригинальный метод, как это делает декоратор python)