- 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/
我想知道将任何数据发送到模板(html/template 包)的真正方法是什么?我的代码如下: var templates = template.Must(template.ParseFiles(
我有密码 if config.Process.TraceLog != "" { f, err := os.OpenFile(config.Process.TraceLog, os.O_RDWR
大家好。我是 GO 的新手,需要一些帮助。我有一个具有这种结构的项目 但让我们假设我的逻辑包 中有 100500 个项目。如果我只需要为特定包导入一个或两个文件怎么办?我可以这样做还是只能导入完整包?
package main import ( "fmt" ) func main() { var square int box := [4]int{1, -2, 3, 4}
我想在每个范围循环后递增一个变量。但是,似乎无法使用标准(for init; condition; post {})语法,因此我想知道为什么。这是我正在尝试做的事情 for item := r
这个问题在这里已经有了答案: Creating a Constant Type and Restricting the Type's Values (2 个答案) 关闭 6 年前。 什么是只允许一组
我试过编译我的简单程序: func main(){fmt.Printf("Hello")} 根据文档在我的 PC 上使用 64 位 Debian Linux 到 MIPS 架构 https://gol
为什么不在 channel 上发送并阻止执行?我怎样才能使这个星座工作,以便我可以向 MoneyDive() 发送信号并继续执行? package main import ( "fmt" )
这是来自 Golang.org http://golang.org/pkg/sort/ // By is the type of a "less" function that defines the
class type User { name string } 是否可以在运行时添加字段age? 最佳答案 不,这是不可能的。 即使使用 Java 或 C++ 语法代替有效的 Go 也不行。
当我编译下面的程序时 func myPrint(v ...interface{}) { fmt.Println("Hello", v...) } func main() { m
有一个问题,这里发生了什么? forever := make(chan bool) log.Printf(" [*] Waiting for messages. To exit press CTRL+
当我运行我的 GoLang 程序时,它抛出了这个异常: packages/go-lang/1.3/pkg/tool/linux_amd64/6l: readsym 不同步 它是否来 self 的 am
我时常会遇到诸如零垃圾或有效使用内存等概念。例如在知名包的特性部分 httprouter您可以看到以下内容: Zero Garbage: The matching and dispatching pr
最近读了golang规范,遇到了一些有趣的操作符: & bitwise AND integers | bitwise OR integers
有这个包https://github.com/open-telemetry/opentelemetry-proto其中仅包含 protobuf 定义。要生成 golang 代码,必须输入: make
有这个包https://github.com/open-telemetry/opentelemetry-proto其中仅包含 protobuf 定义。要生成 golang 代码,必须输入: make
我正在使用下面的代码连接到 grpc 服务器,clientConn 对象用于所有后续的 rpc 调用。 maxDelay 设置为 5 秒。现在由于服务器出现问题,它没有响应 grpc 调用。所以我的客
初始数据: rawdata := []int{17, 23, 100500} 结果: result := convert(rawdata) expected := "1723100500" 我应该用
我想用我的智能手机操作我的窗帘。现在每次我改变手机的位置时都有一个方法 func main() { OnUpdate(func(tPos int) { wc(tPos,cPos)
我是一名优秀的程序员,十分优秀!