1

私は自分のリアルタイムCライブラリにPythonバインディングを実装することに取り組んでいます。Pythonのスレッドは実際のスレッドではなく、実際には並列で実行されないことを読みました(グローバルインタープリターロックのため)。それでも、次のような状況を考えなければなりません。

次のC関数を想像してみてください。

int stoppable_lock(mutex *m, bool *stop)
{
    while (!stop || !*stop)
        if (timed_lock(m, SOME_TIME) == SUCCESS)
            return SUCCESS;
    return DIDNT_LOCK;
}

この関数はミューテックスを待機しますが、を使用するstopことでキャンセルできます。最も単純なケースでは、ミューテックスの他のユーザーに何が起こっても(たとえば、ロックを保持しているときにスレッドが死んだ場合)、スレッドを使用してスレッドを正常に停止できるようにします。

私の問題は、この関数のPythonラッパーを作成する方法を理解することです。引数を(でPyArg_ParseTuple)解析することで、ミューテックスを取得できます。問題ありません。ただし、関数に送信できるもののタイプは、文字列、数値、およびオブジェクトのようです。最初の2つは明らかにを置き換えることはできません。bool *ラッパーを作成するのbool *は良い考えではないと思います。

私の質問は、変数(他のPythonスレッドと共有されている)への参照であり、そのコピーだけではないパラメーターを取得するにはどうすればよいですか?

これが私が欠けている部分の関数です(のような使用法のためにmutex.stoppable_lock(stop)):

static PyObject *_stoppable_lock(_mutex *obj, PyObject *args)
{
    int ret;
    BOOL_STAR stop;
    if (!PyArg_ParseTuple(args, "?", &stop))
    {
        PyErr_SetString(PyExc_ValueError, "Usage: mutex.stoppable_lock(BOOL_STAR)");
        return NULL;
    }
    ret = stoppable_lock(obj->orig, stop);
    if (_set_exception(ret))
        return NULL;
    Py_RETURN_NONE;
}

何がどうあるべきかが私BOOL_STARにはわからないところ。"?"

4

3 に答える 3

1

boolエンベディッドバリューのPythonミューテイター関数を使用して、のラッパータイプを作成する必要があります。独自の型を作成する必要がなく、C_BoolがC++ boolと同じであると信頼できる場合は、ctypes.c_boolを使用できます。その後、Pythonスクリプトで実行できます

   stop = ctypes.c_bool(False)
   stoppable_lock(mutex, ctypes.addressof(stop))

そして、他のスレッドはそれを行うことができますstop.value = True。拡張モジュールはlongを予期し、それをポインターにキャストします。これをよりタイプセーフにしたい場合は、bool用に独自のラッパータイプを作成する必要があります。

于 2013-01-30T17:21:53.523 に答える
0

私の質問は、変数(他のPythonスレッドと共有されている)への参照であり、そのコピーだけではないパラメーターを取得するにはどうすればよいですか?

可変オブジェクトをラップstopして、そのオブジェクトへの参照を渡すことができます。

于 2013-01-30T16:39:04.610 に答える
0

Pythonスレッドは実際のスレッドです(少なくともほとんどのスレッド実装バックエンドのCPythonでは)。しかし、その通りです。GILがあるため、Pythonコード自体は並行して実行されることはありませんが、多くの関数(特に、IO)は並行して実行されます。

主な質問について:C実装ロジック(ブール値への参照を持つ)を直接実行したい場合、NPEはすでに次のように述べています。次のように、可変オブジェクト内にラップできます。

class MutableBool:
    value = False

そうしないと、のコード全体stoppable_lockをPythonで簡単に再実装でき、より簡単になる可能性があります。

于 2013-10-15T16:00:45.313 に答える