如何避免使用PJSUA2造成死锁?

时间:2019-05-26 20:51:51

标签: python locking voip python-multithreading pjsua2

我想在Python中基于PJSUA2 API创建基于控制台的软客户端。

我尝试接听来电时遇到死锁问题。

def onIncomingCall(self, prm):
    c = Call(self, call_id=prm.callId)
    call_prm = pj.CallOpParam()
    call_prm.statusCode = 180
    c.answer(call_prm)

在这种情况下,c.answer(call_prm)永远不会发送回180尝试消息。

def onIncomingCall(self, prm):
    c = Call(self, call_id=prm.callId)
    call_prm = pj.CallOpParam()
    call_prm.statusCode = 180
    c.answer(call_prm)
    raise Exception('test')

如果代码使用额外的Exception进行了扩展,则比c.answer会发送回180 Trying消息。

根据this指南,问题在于死锁。锁位于主线程上,这就是为什么后台工作者无法完成应答函数调用的原因。

如何在接听电话后将锁释放回后台工作线程?

通过以下设置启动端点:

ep_cfg.uaConfig.threadCnt = 1
ep_cfg.uaConfig.mainThreadOnly = False

0 个答案:

没有答案