В Python можно ли сделать поток кода безопасным, если я использую расширение C, которого нет? - PullRequest
2 голосов
/ 06 августа 2011

В моем коде Python есть странные ошибки, и мне интересно, может ли это быть вызвано небезопасным расширением C потока.Можно ли было бы использовать некоторые возможности Python, такие как «блокировка», для решения этой проблемы расширения C?И как я могу это реализовать?

[править 1] Вот как выглядит мой код:

import CextensionPackage as cext

try:
    (output) = cext.extension_function(inputs)
except:
    pass

[править 3] Пакет init .py файл выглядиткак:

from c_ext import functionx

def extension_function( ... )
    ...
    outputs = functionx( ... )

Тогда расширение C_ext.c выглядит так:

#include <Python.h>
#include <cext.h>
static PyObject *functionx(PyObject *self, PyObject *args)
{
char *string;
int stringsize;
if (!PyArg_ParseTuple(args, "s#", &string, &stringsize))
    return NULL;
outputs = thread_unsafe_C_function(string);

[править 2] По сути, я хотел бы вызвать функцию cext.extension_function или thread_unsafe_C_function (ивсе функции, которые он вызывает в библиотеке расширений C) для выполнения в одном потоке.Я думаю, что это решило бы мою проблему, но как я могу это сделать?Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 06 августа 2011

Если код расширения c делает что-то глупое, я не думаю, что у вас есть какой-либо выбор, кроме как выбрать, использовать его или нет. Единственное исключение будет, если у вас есть доступ к коду и вы можете быть уверены, что он делает то, что вам нужно.

Код c может неадекватно высвобождать GIL или создавать собственные потоки внутри.

Можете ли вы сделать что-нибудь, чтобы проблема не существовала без расширения (убедитесь, что ошибка не на вашей стороне)? Возможно, более подробное объяснение вопроса поможет, но если бы я не доверял расширению, я бы просто не использовал его. Я не думаю, что вы можете заставить его делать то, что вы хотите без источника.

[править] Нам нужно увидеть больше кода. Что происходит с выходным параметром? Кроме того, как вы создаете дополнительные темы?

0 голосов
/ 06 августа 2011

Если вы считаете, что ваше расширение C не является поточно-ориентированным, вы можете использовать примитивы синхронизации Python (например, блокировку), чтобы гарантировать, что одновременно в нем выполняется только один поток.У меня нет возможности узнать, поможет ли это вам в ваших проблемах.

...