- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在此ZeroMQ example ,
// Multithreaded Hello World server.
// Uses Goroutines. We could also use channels (a native form of
// inproc), but I stuck to the example.
//
// Author: Brendan Mc.
// Requires: http://github.com/alecthomas/gozmq
package main
import (
"fmt"
zmq "github.com/alecthomas/gozmq"
"time"
)
func main() {
// Launch pool of worker threads
for i := 0; i != 5; i = i + 1 {
go worker()
}
// Prepare our context and sockets
context, _ := zmq.NewContext()
defer context.Close()
// Socket to talk to clients
clients, _ := context.NewSocket(zmq.ROUTER)
defer clients.Close()
clients.Bind("tcp://*:5555")
// Socket to talk to workers
workers, _ := context.NewSocket(zmq.DEALER)
defer workers.Close()
workers.Bind("ipc://workers.ipc")
// connect work threads to client threads via a queue
zmq.Device(zmq.QUEUE, clients, workers)
}
func worker() {
context, _ := zmq.NewContext()
defer context.Close()
// Socket to talk to dispatcher
receiver, _ := context.NewSocket(zmq.REP)
defer receiver.Close()
receiver.Connect("ipc://workers.ipc")
for true {
received, _ := receiver.Recv(0)
fmt.Printf("Received request [%s]\n", received)
// Do some 'work'
time.Sleep(time.Second)
// Send reply back to client
receiver.Send([]byte("World"), 0)
}
}
每个 goroutine 都有自己的 ZeroMQ Context
。然而,在 ZeroMQ guide ,它说了以下内容:
Create one ZeroMQ context at the start of your process, and pass thatto all threads that you want to connect via inproc sockets.
Don't share ZeroMQ sockets between threads. ZeroMQ sockets are notthreadsafe. Technically it's possible to migrate a socket from onethread to another but it demands skill. The only place where it'sremotely sane to share sockets between threads are in languagebindings that need to do magic like garbage collection on sockets.
我知道 goroutines 不是线程。
相反,它们存在于线程中。但我也读到,在 goroutine 之间可以有一个共享对象。
那么,为什么不在 goroutine 之间共享上下文?
我认为它会占用更少的空间,因为其中包含套接字的上下文可能有点大。
但即使它没有那么消耗,为什么在这个例子中根本没有共享上下文?
最佳答案
除了确实共享 Context 实例的(相当极端) 技术选项(在某些合理的情况/场合下),演示的代码段还侧重于零共享,作为一般原则,ZeroMQ 是为数不多的零格言之一,因此众所周知。
采用一组不连续的 Context
实例(在同一个线程中,一个实例也可能有多个这样的实例)是有好处的。性能缩放:
从广义上讲,实例之间的工作负载分离
在更狭义的意义上,直接 IO 线程缩放(在 Context 实例化时定义不同数量的 IO 线程,一些只有 1 个 IO 线程,而其他可能有 2、3 或 10 个 IO 线程用于高性能数据泵引擎)并通过基于setsockopt( ZMQ_AFFINITY ... )
的套接字到 IO 线程映射使用位掩码映射,它允许将一些传输任务直接分离到不同的、discjunct Context
-instances,并且还可以更具体地处理不同的传输流量优先级模式,通过使用Context
-instances 的 IO 线程的单独的专门组(自然地,有意识地配备了更多不同数量的底层 ZeroMQ Context
IO线程)。对于性能扩展和几乎确定性的流量策略处理实现而言,这是一项非常宝贵的功能。
这可能会激发您进一步思考此类细粒度管理(粒度)如何帮助您的分布式应用程序更好地利用 ZeroMQ 框架的服务,以及这种零共享概念如何为您打开性能扩展和吞吐量限制的新世界。
如有疑问,请注意源代码中开头的注释:
...
// Uses Goroutines. We could also use channels (a native form of
// inproc), but I stuck to the example.
...
inproc://
传输类是关于如何从非共享、非阻塞上下文实例中获益并享受几乎线性扩展的明显示例-up,达到峰值性能。
关于multithreading - 为什么 ZeroMQ 上下文没有在所有 goroutine 之间共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42034641/
出现以下错误 Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable D
在调试应用程序时出现以下错误。 The CLR has been unable to transition from COM context 0x3b2d70 to COM context 0x3b2
在 GAE Go 中,为了记录,我们需要使用 appengine.NewContext(r) 创建一个新的上下文,它返回 context.Context。 如何使用此上下文在请求范围内设置/获取变量?
我想使用 Puppeteer 从放置在页面上 iframe 内的选择器中获取数据,该页面在与其父框架域不同的域上运行。因此,我不是任何域的所有者 - 无法使用 frame.postMessage。 试
我正在尝试获取可用的应用程序上下文并想切换到 webview 上下文,但 appium 仅获取 Navive App。 应用程序还启用了 WebView。 Appium 版本:1.10.1 Chrom
这个问题在这里已经有了答案: How to fix this nullOk error when using the flutter_svg package? (7 个回答) 7 个月前关闭。 当我尝
我观看了关于 Core Data 的 2016 WWDC 视频并查看了各种教程。我见过使用 Core Data Framework 创建对象以持久保存到 managedObjectContext 中的
这是代码 obj = { a: 'some value'; m: function(){ alert(this.a); } } obj.m(); 结果是'som
我正在尝试做类似的事情 $(".className").click(function() { $(this).(".anotherClass").css("z-index","1");
var User = { Name: "Some Name", Age: 26, Show: function() { alert("Age= "+this.Age)}; }; fun
我目前正在使用我见过的常见 Context 模式,它允许子组件通过传递修饰函数来更新父组件的状态(即 Provider)通过共享的 Context。 我遇到的问题是,修改函数只引用原始状态,不引用最新
有没有办法让 React Context类型安全与流类型? 例如: Button.contextTypes = { color: React.PropTypes.string }; 最佳答案 不幸
我想知道是否有一种方法可以为不同的功能使用不同的上下文类。 我希望有一个功能使用 MinkExtensions 进行浏览器测试,另一个功能使用和 HTTP 客户端(如 Guzzle)进行 API 测试
我有这个配置文件 apiVersion: v1 clusters: - cluster: server: [REDACTED] // IP of my cluster name: stag
我在实现非抢先式调度时遇到了用于初始化TCB的代码。 typedef struct TCB_t { struct TCB_t *next; struct TCB_t
我想将一个函数设置为数组中每个元素的属性,但使用不同的参数调用它。我想我会使用匿名函数来解决它: for ( var i = 0; i < object_count; i++ ) { obje
这个问题已经有答案了: How to access the correct `this` inside a callback (15 个回答) 已关闭 7 年前。 我正在做一些练习,但我在管道方法中丢
我正在尝试通过 Java 和 Android Studio 学习和制作 Android 应用程序。我对Java的了解程度是两年前几个小时的youtube学习和大学基础类(class)。不过我确实知道如
我在(这个)上遇到了问题。错误ImageView无法应用。我在 fragment 类中执行此代码。 ViewFlipper v_flipper; @Nullable @Override public
我想使用 openGL 的某些功能,但与渲染视觉内容无关。有没有办法在没有任何依赖性的情况下创建它(不是对 Windows,也不是某些包[SDL,SFML,GLUT])?只允许使用没有外部库的库,就像
我是一名优秀的程序员,十分优秀!