- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个问题,我设法解决了...但是我有点担心,因为我真的不明白为什么该解决方案有效;
我正在使用 NetMQ,特别是具有多个套接字的 NetMQ 轮询器,其中一个是 REQ-REP 对。
我有一个请求队列,这些请求被从队列中取出,服务器根据需要处理每个请求类型并发回适当的响应。这一直没有问题,但是当我尝试添加其他请求类型时,系统按预期停止工作;会发生什么是请求将到达服务器,服务器将发送响应......而客户端不会收到它。在服务器关闭之前,客户端不会收到消息(异常行为!)。
我一直在使用我在发送请求之前设置的标志来管理 REQ-REP 对,并在收到回复时重置。我设法通过只在 REQ 套接字的“SendReady”事件中触发回复来解决这个问题——这自动修复了我的所有问题,但是我在文档中找不到任何东西告诉我为什么套接字可能没有处于“发送就绪”状态,或者这实际上是做什么的。
任何可以透露为什么现在可以正常工作的信息都很棒 :)
干杯。
客户:
“订阅”作为 UI 的单独线程运行
private void Subscribe(string address)
{
using (var req = new RequestSocket(address + ":5555"))
using (var sub = new SubscriberSocket(address + ":5556"))
using (var poller = new NetMQPoller { req, sub })
{
// Send program code when a request for a code update is received
sub.ReceiveReady += (s, a) =>
{
var type = sub.ReceiveFrameString();
var reply = sub.ReceiveFrameString();
switch (type)
{
case "Type1":
manager.ChangeValue(reply);
break;
case "Type2":
string[] args = reply.Split(',');
eventAggregator.PublishOnUIThread(new MyEvent(args[0], (SimObjectActionEventType)Enum.Parse(typeof(MyEventType), args[1])));
break;
}
};
req.ReceiveReady += Req_ReceiveReady;
poller.RunAsync();
sub.Connect(address + ":5556");
sub.SubscribeToAnyTopic();
sub.Options.ReceiveHighWatermark = 10;
reqQueue = new Queue<string[]>();
reqQueue.Enqueue(new string[] { "InitialiseClient", "" });
req_sending = false;
while (programRunning)
{
if (reqQueue.Count > 0 && !req_sending)
{
req_sending = true;
string[] request = reqQueue.Dequeue();
Console.WriteLine("Sending " + request[0] + " " + request[1]);
req.SendMoreFrame(request[0]).SendFrame(request[1]);
}
Thread.Sleep(1);
}
}
}
private void Req_ReceiveReady(object sender, NetMQSocketEventArgs e)
{
var req = e.Socket;
var messageType = req.ReceiveFrameString();
Console.WriteLine("Received {0}", messageType);
switch (messageType)
{
case "Reply1":
// Receive action
break;
case "Reply2":
// Receive action
break;
case "Reply3":
// Receive action
break;
}
req_sending = false;
}
服务器:
using (var rep = new ResponseSocket("@tcp://*:5555"))
using (var pub = new PublisherSocket("@tcp://*:5556"))
using (var beacon = new NetMQBeacon())
using (var poller = new NetMQPoller { rep, pub, beacon })
{
// Send program code when a request for a code update is received
rep.ReceiveReady += (s, a) =>
{
var messageType = rep.ReceiveFrameString();
var message = rep.ReceiveFrameString();
Console.WriteLine("Received {0} - Content: {1}", messageType, message);
switch (messageType)
{
case "InitialiseClient":
// Send
rep.SendMoreFrame("Reply1").SendFrame(repData);
break;
case "Req2":
// do something
rep.SendMoreFrame("Reply2").SendFrame("RequestOK");
break;
case "Req3":
args = message.Split(',');
if (args.Length == 2)
{
// Do Something
rep.SendMoreFrame("Reply3").SendFrame("RequestOK");
}
else
{
rep.SendMoreFrame("Ack").SendFrame("RequestError - incorrect argument format");
}
break;
case "Req4":
args = message.Split(',');
if (args.Length == 2)
{
requestData = //do something
rep.SendMoreFrame("Reply4").SendFrame(requestData);
}
else
{
rep.SendMoreFrame("Ack").SendFrame("RequestError - incorrect argument format");
}
break;
default:
rep.SendMoreFrame("Ack").SendFrame("Error");
break;
}
};
// setup discovery beacon with 1 second interval
beacon.Configure(5555);
beacon.Publish("server", TimeSpan.FromSeconds(1));
// start the poller
poller.RunAsync();
// run the simulation loop
while (serverRunning)
{
// todo - make this operate for efficiently
// push updated variable values to clients
foreach (string[] message in pubQueue)
{
pub.SendMoreFrame(message[0]).SendFrame(message[1]);
}
pubQueue.Clear();
Thread.Sleep(2);
}
poller.StopAsync();
}
最佳答案
您正在使用来自多个线程的请求套接字,这是不支持的。您在主线程上发送并在轮询器线程上接收。
尝试使用 NetMQQueue 而不是使用常规队列,您可以将其添加到轮询器并从 UI 线程入队。然后发送和接收都发生在轮询器线程上。
您可以在此处阅读文档: http://netmq.readthedocs.io/en/latest/queue/
关于zeromq - NetMQ 为什么 Req-Rep 需要 "SendReady"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37804936/
我应该如何继续将 std::chrono::minutes::rep 类型值转换为小时表示。 #include #include using namespace std; using namesp
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
我有一个带有3个kafka节点和3个zk节点的kakfa集群。 生产者在AWS机器上尝试将数据推送到我的Intranet服务器上运行的kafka集群上。 使用以下命令从控制台创建主题(JOB_AWS_
我有关于序列和 each 的快速问题: vect1 <- c(4, 5, 10, 3, 1) 我想用这个向量复制每个,这样第一个数字被复制 4,第二个 5,第三个 10,第四个 3 和第五个等于 1。
当我在控制台中键入泛型的函数名称时,我希望看到对 UseMethod 的调用。例如,the documentation for determinant 将其称为泛型,当我将其输入控制台时得到以下输出:
我正在尝试理解 SIMD 和向量指令的概念。如果我理解正确的话: 向量指令是对一维数据数组(=向量)进行操作的指令,而不是对单个数据项进行操作的标量指令。 SIMD指令实际上是单指令多数据指令,看起来
引用英特尔® 64 和 IA-32 架构优化引用手册,第 2.4.6 节“REP 字符串增强”: The performance characteristics of using REP string
我正在尝试编写一个应用程序,允许用户启动长时间运行的计算进程,该进程将从使用 ØMQ 的 Web 服务器接收命令。我使用标准的请求-回复架构:服务器有一个连接到工作进程 REP 套接字的 REQ 套接
我希望使用多线程通过 Python 和 ZeroMQ 实现 REQ-REP 模式。 使用 Python,我可以在新客户端连接到服务器时创建一个新线程。该线程将处理与该特定客户端的所有通信,直到套接字关
我想创建一个列表,它是向量的 8 倍 c(2,6) ,即 8 个向量的列表。 错误:object = as.list(rep(c(2,6),8))结果是 16 个单个数字的列表:2 6 2 6 2 6
我需要将一个向量分解成一系列 x 并重复,我不太确定这个术语是什么。它是 rep 的倒数功能。所以一个向量 [1,2,2,2,2,1,1,1,1,1,2,2] -> [1x1, 4x2, 5x1, 2
x=1:20 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 rep(x,2) [1] 1 2 3 4 5 6 7 8 9 10 11 1
假设我做了一个长 REP INSB在普通优先级线程中从用户模式读取 PCI 设备寄存器。在它执行期间,以下哪些可以发生,哪些不能发生: 中断(其他内核) 中断(同核) PCI 访问(其他内核) PCI
怎么才能使用说明rep stosb执行速度比这段代码快? Clear: mov byte [edi],AL ; Write the value in AL to memory
我需要从端口读取一些 16 位值并将它们保存到缓冲区。我正在使用的教程建议使用 REP INSW 指令,但我不知道如何使用它,甚至不知道它是如何工作的...... 这条指令相当于两条IN指令吗? 最佳
什么是重用/发布等效原则以及为什么它很重要? 最佳答案 重用/发布等效原则 (REP) 说: The unit of reuse is the unit of release. Effective r
给定一个向量,例如 > x [1] 1 1 2 1 1 1 5 1 1 1 5 7 1 1 1 1 1 1 1 1 1 我想复制元素n次——但是——我希望旧元素被复制覆盖。使用基本的 rep 函数给
我需要从端口读取一些 16 位值并将它们保存到缓冲区。我正在使用的教程建议使用 REP INSW 指令,但我不知道如何使用它,甚至不知道它是如何工作的...... 这条指令相当于两条IN指令吗? 最佳
我在 Visual Studio 2008 上测试一些代码并注意到 security_cookie。我能理解它的意思,但我不明白这个指令的目的是什么。 rep ret /* REP to av
我想知道是否有更简单的方法来制作列表,例如 10 '4'、20 '6' 和 30 '3' 然后用函数 'rep 手写 (example <- c(4,4,4,4,...)) '.我知道我可以将某个序列
我是一名优秀的程序员,十分优秀!