如何订阅频道,然后在不阻止的情况下执行其他操作?

时间:2014-05-15 07:20:05

标签: c asynchronous redis publish-subscribe nonblocking

我正在使用redis pub / sub进行一些实时处理。

在订阅结束时,我想订阅指定的频道,然后进行其他一些计算。如果我向服务器发送subscribe命令,它会阻止代码。

那么我该如何做其他事情,当订阅消息到达时,我通过回调处理程序处理它?<​​/ p>

2 个答案:

答案 0 :(得分:1)

您需要两个不同的连接才能做到这一点。这是一个设计选择,因为当您SUBSCRIBE / PSUBSCRIBE时,实际上连接语义从Request-Response变为Push-style,因此不适合运行命令而不实现更复杂的语义,例如, IMAP协议。

答案 1 :(得分:0)

第一点是将Redis连接专用于订阅。一旦在连接上应用了SUBSCRIBE或PUSBSCRIBE,就只能完成与订阅相关的命令。因此,在C程序中,您需要至少一个用于订阅的连接,以及一个与Redis做任何其他事情的连接。

然后你还需要找到一种方法来处理来自C程序的这两个连接。有几种解决方案可行。例如:

  • 使用多线程,并将一个线程专用于负责订阅的连接。在接收新事件时,专用线程应将消息发布到主应用程序线程,这将激活回调。

  • 使用非阻塞和异步API。 Hiredis附带事件循环适配器。您需要一个事件循环来处理与Redis的连接(包括专用于订阅的连接)。在接收到发布事件时,相关的回调将由事件循环直接触发。这是an example of subscription with hiredis and libevent