gpt4 book ai didi

python - ZMQ : "Resource temporarily unavailable" when connecting zmq socket

转载 作者:行者123 更新时间:2023-12-04 11:32:02 24 4
gpt4 key购买 nike

我正在尝试通过 czmqz (4.0.2) 使用 libzmq (4.2.2) 在 Python 程序和我的 C++ 应用程序之间建立 IPC 通信 channel 。

我正在使用 ZMQ 发布者/订阅者模式,其中 Python 程序绑定(bind)到一个端口并使用 pyzmq (16.0.2) 发布消息,而我的 C++ 程序使用 zsock class从 CZMQ 以订阅者身份连接。

问题是,每当我的订阅者尝试连接时,我都会收到错误代码 11,资源暂时不可用。奇怪的是,这个系统似乎在我的开发机器上工作得很好,但在我要部署到的目标系统上却不行。

问题出现在以下简化方法中初始化套接字的第一行:

bool ZmqSocketWrapper::connectSubscriber(string address)
{
m_address = address;
m_pSocket = zsock_new_sub(address.c_str(), "");

int errorCode = zmq_errno();
if (errorCode != 0)
{
printf(zmq_strerror(errorCode));
return false;
}

return true;
}

调用如下:

m_subscriberSocket->connectSubscriber("tcp://127.0.0.1:5555");

我还尝试了其他变体,结果相同:

m_subscriberSocket->connectSubscriber("tcp://localhost:23232");
m_subscriberSocket->connectSubscriber("ipc:///tmp/test");

在网上搜索时,似乎大多数其他人在尝试发送/接收时都遇到了这个问题,所以我在尝试打开套接字时遇到这个问题似乎很奇怪。

其他一些细节:

  • 我的 ZMQ 发布器是使用 pyzmq 在 Python 中编写的,在同一目标系统上 运行良好,这表明问题出在 czmq 中。
  • 我遇到问题的机器是 Raspberry Pi,以防相关,但请记住以上几点。
  • 没有,没有其他东西在使用那个端口,我已经使用 netstat 确认服务器端口正在监听。
  • 是的,我试过以 root 身份运行我的客户端。

非常感谢任何帮助!

最佳答案

好消息是纯pyzmq场景运行良好,

硬件或 O/S 相关问题似乎已从故障列表中排除。


该死的绑定(bind)(通过“高级”倾斜抽象来盲目用户程序)

首先是,
一些高级实业家提倡摆脱 native API 删除用户端选项。

CZMQ 之所以这样做,是因为它假设每个 SUB-side 想要只是 .connect(),不保留反向 .bind()/.connect() 选项可用。旧的好 ZeroMQ API 总是让用户有这个选择,这是公平的。同样,有许多性能调整变量需要在设置套接字连接之前设置,这使得“高级”绑定(bind)对于分布式系统实现来说更加麻烦。

接下来是一件奇怪的事情,代码在一个盒子上运行良好,而在另一个盒子上运行不正常。

我担心的是将 LINGER 设置为零 + .close() 任何此类创建的 SUB 套接字(其中如果没有适当的异常处理,则不需要发生)在 zmq.Context() 实例安全地 .term() 之前。这可能会挂起孤儿,后来导致真正的资源被(仍然)占用,导致 errno 代码 11,Resource temporary unavailable.

最后但并非最不重要的一点——资源不是消耗品/一次性用品

建议的代码无法更好地展示此类资源效率低下的行为,并且会累积每次调用的所有设置/配置/拆卸开销成本。这是一个非常糟糕的设计实践(虽然用户可能会在许多“教科书”示例中遇到它)。如果对高效分布式计算参数的更多细节感兴趣,也与此相关, may also like this post.

bool ZmqSocketWrapper::connectSubscriber(string address)
{ b_RetFLAG = true;
m_address = address;
m_pSocket = zsock_new_sub(address.c_str(), "");

int errorCode = zmq_errno();
if (errorCode != 0)
{
printf(zmq_strerror(errorCode));
b_RetFLAG = false;
}
// -------------------------------------------------------------
zsock_destroy( &m_pSocket ); // USER's MANDATORY DUTY PRE-RET
// -------------------------------------------------------------
return b_RetFLAG;
}

如果确实有麻烦,

使用 native API,您的代码在其中完全控制舞台。

关于python - ZMQ : "Resource temporarily unavailable" when connecting zmq socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45553125/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com