- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 Python 上,ZeroMQ .recv()/.send()
操作是阻塞的,这对于 REQ/REP
.
在 Golang 中,我必须将 zmq.DONTWAIT
传递给 .recv()
并且.send()
操作以使其工作。
但问题是,流程需要锁步,所以:
server.recv()
client.send()
client.recv()
server.send()
在 3 到 4 之间,奇怪的事情开始了,因为它们是异步的。
当客户端发送了一条消息,而服务器还没有收到消息,但客户端试图接收响应时,锁步就不再是锁步了。
是否有某种 zmq.DOBLOCK
与 zmq.DONTWAIT
不同?
还是我弄错了什么?
编辑:
我在 C 中为 zeromq 使用这个 go 绑定(bind):https://godoc.org/github.com/pebbe/zmq4#Type
正如您在这里看到的,.recv()
需要一个输入 flag
,这是第二个 ref 中的两者之一:
接收:https://godoc.org/github.com/pebbe/zmq4#Socket.Recv
要传递的标志:https://github.com/pebbe/zmq4/blob/master/zmq4.go#L403
这是我用来解决问题的当前代码,感觉有点难看:
package connection
import (
"zmq4"
"fmt"
"time"
)
const ERRTMPUNAV="resource temporarily unavailable"
func checkError(e error){
if e != nil {
panic(e)
}
}
func CreateRepNode(address string,onMessage chan<- string,send <-chan string,closeConn <-chan bool){
stop:=false
socket,err:=zmq4.NewSocket(zmq4.REP)
checkError(err)
err=socket.Bind(address)
checkError(err)
go func(socket *zmq4.Socket){
for {
msg,err:=socket.Recv(zmq4.DONTWAIT)
fmt.Println("server message"+msg)
if stop==true {
return
}
if err != nil {
rateLimit := time.Tick(100 * time.Millisecond)
<-rateLimit
continue
}
checkError(err)
onMessage<-msg
rep:=<-send
_,err=socket.Send(rep,zmq4.DONTWAIT)
}
}(socket)
<-closeConn
stop=true
}
func CreateReqNode(address string,onMessage chan<- string,send <-chan string,closeConn <-chan bool){
stop:=false
socket,err:=zmq4.NewSocket(zmq4.REQ)
checkError(err)
err=socket.Connect(address)
checkError(err)
go func(){
for {
msg:=<-send
if stop==true {
return
}
_,err:=socket.Send(msg,zmq4.DONTWAIT)
for {
msg,err=socket.Recv(zmq4.DONTWAIT)
fmt.Println("client got message "+msg)
if err!=nil {
if err.Error()==ERRTMPUNAV {
w:=time.Tick(100*time.Millisecond)
<-w
continue
}
}
break
}
onMessage<-msg
}
}()
<-closeConn
stop=true
}
最佳答案
ZeroMQ 琐碎的基本原型(prototype)与其说是满足任何需求的生产级解决方案,不如说是一组构建 block 。
Go-lang 是一种非常强大的现代语言,带有协程和其他用于控制并发的智能工具,因此请原谅我列出以下建议:
尽可能避免阻塞式设计(非阻塞式设计让人们可以完全控制所有出现的事物......不会“卡在任何地方” 无限/无法控制的等待循环,在已经形成的死锁中更糟)
避免依赖 SLOC 示例和单一、基本类型的正式通信模式,人们应该为所有的稳健的生存能力处理策略可能出现问题的情况(传输网络中的信号丢失、消息丢失、DDoS 级别的资源过载……)
REQ/REP
。是的,从来没有...ZeroMQ 可扩展正式通信模式 REQ/REP
适合学习 ZeroMQ,但在实际生产级部署中是致命的。 For details, read here .
接下来考虑内部无条件模式,例如 PAIR
(尽管标记为实验性,但对于某些用例来说效果很好),XREQ/XREP
、PUSH/PULL
或一些复合信令/传输多套接字定制设计自己的模式。
What I can do for your further questions right now is to direct you to see a bigger picture on this subject有更多的论点,一个简单的信号平面/消息平面插图和一个指向 Pieter HINTJENS 必读书籍的直接链接。
这本书值得花时间和精力。如果一个人对分布式系统设计很认真,那么您会爱上它以及 Pieter 对零共享、零阻塞、(几乎)零复制等的热情。
关于asynchronous - 戈朗 ZeroMQ : REQ/REP senseless non-blocking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40422572/
我应该如何继续将 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,...)) '.我知道我可以将某个序列
我是一名优秀的程序员,十分优秀!