我试图通过czmqz(4.0.2)使用libzmq(4.2.2)在Python程序和我的C ++应用程序之间建立IPC通信通道。
我正在使用ZMQ发布者/订阅者模式,其中Python程序绑定到端口并使用pyzmq(16.0.2)发布消息,而我的C ++程序使用来自CZMQ的zsock class作为连接订户。
问题是,每当我的订户尝试连接时,我都会收到错误代码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");
在网上搜索时,似乎大多数其他人在尝试发送/接收时都有这个问题,所以当我试图打开套接字时,我有这个问题似乎很奇怪。
其他一些细节:
非常感谢任何帮助!
答案 0 :(得分:1)
pyzmq
场景正常,硬件或操作系统相关问题似乎已从故障列表中排除。
首先,是 一些高级实业家推动逃避原生API,取消了用户方面的选择。
CZMQ就是这样做的,因为它假定每个SUB
- 想要只是.connect()
,而不是离开{ {1}}可供选择。旧的好ZeroMQ API总是让用户选择这个选项,这是公平的。类似地,有许多性能调优变量需要在设置套接字连接之前设置,这使得“高级”绑定对于分布式系统实现更加麻烦。
接下来是奇怪的事情,代码在一个盒子上运行正常,而不是另一个盒子。
我担心用户责任是将.bind()/.connect()
设置为零+ LINGER
任何此类创建的.close()
套接字(如果没有适当的异常处理,则不需要这样做)SUB
实例安全zmq.Context()
之前 - 已经过了。这可能会导致以后导致真实资源(仍然)被占用的孤儿,导致.term()
代码11, errno
建议的代码无法更好地展示此类资源的低效行为,并累积每次调用的所有设置/配置/拆卸开销成本。这是一种非常糟糕的设计实践(用户可能会在许多“教科书”示例中遇到它)。如果对有效的分布式计算参数的更多细节感兴趣,也与此相关, may also like this post.
Resource temporarily unavailable.
使用本机API,您的代码可以完全控制舞台。