ZeroMQ CLRZMQ轮询

2024-05-15 09:40:56 发布

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

我用Python和Pyzmq一起使用ZMQ已经有一段时间了,我必须使用CLRZMQ绑定将部分代码移植到C。我在Google上四处寻找一些文档,但是我几乎什么都没找到,除了一些过时的代码示例,它们甚至都不起作用,这非常令人沮丧。在

我现在要达到的目标很简单。我们有一个简单的函数,它用超时轮询套接字,当超时时间过去时,它会引发一个自定义异常。下面是Python中的外观:

def raise_on_timeout(sock, timeout):
    """
    sock is a ZMQ socket
    timeout is a timedelta object from datetime.
    """
    if timeout is not None:
        timeout = int(timeout.total_seconds() * 1000)
        if not sock.poll(timeout):
            raise TimeoutException("Communication timed out")

看起来很简单,对吧?此函数在send_multipart和recv_multipart之间调用,以便在侦听数据时出现超时,我们可以对此进行管理。在

如何用CLRZMQ在C中实现类似的东西?在

另外,如果在CLRZMQ之前有任何api文档,如果您能指出我在哪里可以找到它,我将不胜感激。在

谢谢


Tags: 函数代码文档示例ifisgoogletimeout
3条回答

好吧,我成功了。在

下面的代码在C中创建一个类似的raise_on_timeout方法。在

public static void RaiseOnTimeout(Context ctx, Socket sock, TimeSpan timeout)
{
    List<PollItem> pollItemsList = new List<PollItem>();
    PollItem pollItem = sock.CreatePollItem(IOMultiPlex.POLLIN);
    pollItemsList.Add(pollItem);

    int numReplies = ctx.Poll(pollItemsList.ToArray(), timeout.Value.Ticks * 10);

    if (numReplies == 0)
    {
        throw new TimeoutException();
    }
}

是这样的。但并不明显,因为C的医生很少。我只是从指南中的Java示例中得到启发,即使在那里,它们也没有真正解释什么起作用。只是想办法解决。在

好吧,这是最终的答案。在这个例子中,我甚至不需要上下文的实例。那样好多了。在

下面的代码在C中创建一个类似的raise_on_timeout方法。在

public static void RaiseOnTimeout(Socket sock, TimeSpan timeout)
{
    List<PollItem> pollItemsList = new List<PollItem>();
    PollItem pollItem = sock.CreatePollItem(IOMultiPlex.POLLIN);
    pollItemsList.Add(pollItem);

    int numReplies = Context.Poller(pollItemsList.ToArray(), timeout.Value.Ticks * 10);

    if (numReplies == 0)
    {
        throw new TimeoutException();
    }
}

好吧。我认为我可能已经找到了解决办法。虽然我还没有测试过。在

为了实现与我在Python中想做的相同的事情,这个应该以同样的方式来实现。在

private static void RaiseOnTimeout(Socket sock, long timeoutMicroSeconds)
{
    List<socket> sockList = new List<Socket>() {sock};
    int numEvents = Context.Poller(sockList), timeoutMicroSeconds);

    if (numEvents == 0)
    {
        throw new TimeoutException();
    }
}

有什么想法?在

相关问题 更多 >