我有C++的DLL,它可以用多个线程工作。 所以我用Cython包装了这个库并创建了特殊的接收器回调函数,它必须向异步队列. 在
cdef void __cdecl NewMessage(char* message) nogil:
我把它标记为nogil,这个回调调用来自另一个线程。 在这个回调中,我只使用:
^{pr2}$这里陷入僵局。 如何解决?在
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;
}
赛顿代码:
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)
完整代码: .hhttp://pastebin.com/ZTCjc6NA
.cpphttp://pastebin.com/MeygA8im
这是一个猜测,但是你可能有一个Cython /C/C++循环运行,它保存吉尔而从不释放它。然后强制回调等待它。在
在普通的Python代码中,如果另一个线程正在等待GIL,则每隔几条指令就释放一次GIL。在Cython,这不会自动发生。确保这种情况经常发生的一种方法是循环:
这确保了GIL在每个循环中释放一次。在
不幸的是,我不清楚你的主循环在哪里。我想知道它是否在您的
^{pr2}$PyTeamSpeak3
类的connect
内,并且可能会更改connect to的定义:可能有帮助吗?在
相关问题 更多 >
编程相关推荐