私は複数のスレッドで動作するC++のdllを持っています。 私はこのライブラリをCythonでラップし、特殊な受信側のコールバック関数を作成しました。これはasyncio.Queueにいくつかの結果を追加する必要があります。将来の addの結果をCythonの別のスレッドからキューに入れる方法は?
私はこれをnogilとマークしました。このコールバックは別のスレッドからコールします。
with gil:
print("hello") # instead adding to Queue. print("hello") is more simple operation to demostrate problem
そして、ここでデッドロックを得た:私はちょうど使用このコールバックで 。 解決方法
C++コールバック宣言(ヘッダ):
typedef void (*receiver_t)(char*);
void SetReceiver(receiver_t new_rec);
CPP:
static receiver_t receiver = nullptr;
void SetReceiver(receiver_t new_rec)
{
printf("setted%i\n", (int)new_rec);
a = 123;
if (new_rec != nullptr)
receiver = new_rec;
}
Cythonコード:
cdef extern from "TeamSpeak3.h":
ctypedef void (*receiver_t) (char*) nogil
cdef void __cdecl SetReceiver(receiver_t new_rec) nogil
cdef void __cdecl NewMessage(char* message) nogil:
with gil:
print("hello")
SetReceiver(NewMessage)
フルコード: .H http://pastebin.com/ZTCjc6NA
の.cpp http://pastebin.com/MeygA8im
.pyx http://pastebin.com/k4X9c54P
の.py http://pastebin.com/1YV7tMiF
受信者を呼び出すメインコードをどのように開始しますか? – michitux
@michituxソースリンクを追加しました。 '.py'ではcythonクラスを' .pyx'から初期化し、cythonクラスは '.h'と' .cpp'からcppクラスを初期化し、cppクラスはコールバックを渡してTeamSpeak3 APIを呼び出します。 生のシンプルコード。 – Broly