如何从Cython中的另一个线程设置future\add到队列的结果?

2024-10-02 06:36:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有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

.pyxhttp://pastebin.com/k4X9c54P

.pyhttp://pastebin.com/1YV7tMiF


Tags: commessagenew线程receiverreccharcdef
1条回答
网友
1楼 · 发布于 2024-10-02 06:36:45

这是一个猜测,但是你可能有一个Cython /C/C++循环运行,它保存吉尔而从不释放它。然后强制回调等待它。在

在普通的Python代码中,如果另一个线程正在等待GIL,则每隔几条指令就释放一次GIL。在Cython,这不会自动发生。确保这种情况经常发生的一种方法是循环:

while True:
   # ... do stuff
   with nogil:
      pass

这确保了GIL在每个循环中释放一次。在

不幸的是,我不清楚你的主循环在哪里。我想知道它是否在您的PyTeamSpeak3类的connect内,并且可能会更改connect to的定义:

^{pr2}$

可能有帮助吗?在

相关问题 更多 >

    热门问题