将 ZeroMQ 与 C# 和 inproc 传输一起使用

2024-04-14

我正在尝试 ZeroMQ 并试图得到某物在职的。我的第一个想法是使用 inproc 传输设置 REP/REQ,看看是否可以在两个线程之间发送消息。下面的大部分代码取自 clzmq 示例,但它似乎不起作用。

服务器和客户端都绑定到传输,但是当客户端尝试执行Send它会阻塞并坐在那里。我没有 ZeroMQ 经验,所以我不知道该先看哪里,任何帮助将不胜感激。这是令人反感的(进攻性)代码:

using System;
using System.Diagnostics;
using System.Threading;
using NUnit.Framework;
using ZMQ;

namespace PostBox
{
    [TestFixture]
    public class Class1
    {

        private const string Address = "inproc://test";
        private const uint MessageSize = 10;
        private const int RoundtripCount = 100;

        [Test]
        public void Should()
        {
            var clientThread = new Thread(StartClient);
            clientThread.Start();

            var serverThread = new Thread(StartServer);
            serverThread.Start();

            clientThread.Join();
            serverThread.Join();

            Console.WriteLine("Done with life");
        }

        private void StartServer()
        {


            //  Initialise 0MQ infrastructure
            using (var ctx = new Context(1))
            {
                using (var skt = ctx.Socket(SocketType.REP))
                {
                    skt.Bind(Address);

                    Console.WriteLine("Server has bound");

                    //  Bounce the messages.
                    for (var i = 0; i < RoundtripCount; i++)
                    {
                        var msg = skt.Recv();
                        Debug.Assert(msg.Length == MessageSize);
                        skt.Send(msg);
                    }
                    Thread.Sleep(1000);
                }
            }

            Console.WriteLine("Done with server");
        }

        private void StartClient()
        {
            Thread.Sleep(2000);

            //  Initialise 0MQ infrastructure
            using (var ctx = new Context(1))
            {
                using (var skt = ctx.Socket(SocketType.REQ))
                {
                    skt.Bind(Address);

                    Console.WriteLine("Client has bound");

                    //  Create a message to send.
                    var msg = new byte[MessageSize];

                    //  Start measuring the time.
                    var watch = new Stopwatch();
                    watch.Start();

                    //  Start sending messages.
                    for (var i = 0; i < RoundtripCount; i++)
                    {
                        skt.Send(msg);
                        msg = skt.Recv();
                        Debug.Assert(msg.Length == MessageSize);

                        Console.Write(".");
                    }

                    //  Stop measuring the time.
                    watch.Stop();
                    var elapsedTime = watch.ElapsedTicks;

                    //  Print out the test parameters.
                    Console.WriteLine("message size: " + MessageSize + " [B]");
                    Console.WriteLine("roundtrip count: " + RoundtripCount);

                    //  Compute and print out the latency.
                    var latency = (double)(elapsedTime) / RoundtripCount / 2 *
                        1000000 / Stopwatch.Frequency;
                    Console.WriteLine("Your average latency is {0} [us]",
                        latency.ToString("f2"));
                }
            }

            Console.WriteLine("Done with client");
        }

    }
}

Edit:

我在下面的答案的帮助下得到了这个工作,但它也需要我改变Bind to a Connect,当您考虑它时,这是有道理的,因为我们有一个绑定到本地传输的服务器和一个连接到远程传输的客户端。这是更新后的代码:

using System;
using System.Diagnostics;
using System.Threading;
using NUnit.Framework;
using ZMQ;

namespace PostBox
{
    [TestFixture]
    public class Class1
    {

        private const string Address = "inproc://test";
        private const uint MessageSize = 10;
        private const int RoundtripCount = 100;

        private static Context ctx;

        [Test]
        public void Should()
        {
            using (ctx = new Context(1))
            {
                var clientThread = new Thread(StartClient);
                clientThread.Start();

                var serverThread = new Thread(StartServer);
                serverThread.Start();

                clientThread.Join();
                serverThread.Join();

                Console.WriteLine("Done with life");
            }
        }

        private void StartServer()
        {
            try
            {
                using (var skt = ctx.Socket(SocketType.REP))
                {
                    skt.Bind(Address);

                    Console.WriteLine("Server has bound");

                    //  Bounce the messages.
                    for (var i = 0; i < RoundtripCount; i++)
                    {
                        var msg = skt.Recv();
                        Debug.Assert(msg.Length == MessageSize);
                        skt.Send(msg);
                    }
                    Thread.Sleep(1000);
                }

                Console.WriteLine("Done with server");
            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }

        private void StartClient()
        {
            Thread.Sleep(2000);

            try
            {
                //  Initialise 0MQ infrastructure
                using (var skt = ctx.Socket(SocketType.REQ))
                {
                    skt.Connect(Address);

                    Console.WriteLine("Client has bound");

                    //  Create a message to send.
                    var msg = new byte[MessageSize];

                    //  Start measuring the time.
                    var watch = new Stopwatch();
                    watch.Start();

                    //  Start sending messages.
                    for (var i = 0; i < RoundtripCount; i++)
                    {
                        skt.Send(msg);
                        msg = skt.Recv();
                        Debug.Assert(msg.Length == MessageSize);

                        Console.Write(".");
                    }

                    //  Stop measuring the time.
                    watch.Stop();
                    var elapsedTime = watch.ElapsedTicks;

                    //  Print out the test parameters.
                    Console.WriteLine("message size: " + MessageSize + " [B]");
                    Console.WriteLine("roundtrip count: " + RoundtripCount);

                    //  Compute and print out the latency.
                    var latency = (double)(elapsedTime) / RoundtripCount / 2 *
                                  1000000 / Stopwatch.Frequency;
                    Console.WriteLine("Your average latency is {0} [us]",
                                      latency.ToString("f2"));
                }

                Console.WriteLine("Done with client");
            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }

    }
}

我相信,两个线程都需要使用相同的上下文。 Zeromq 指南建议不要在一个进程中使用多个上下文。 创建一个上下文,在两个线程之间共享该上下文。这应该有效。

From http://zguide.zeromq.org/chapter:all http://zguide.zeromq.org/chapter:all

您必须为您的流程创建一个“上下文”对象,并将其传递给 所有线程。上下文收集 ØMQ 的状态。创建连接 across the inproc: 传输,服务器和客户端线程必须共享 相同的上下文对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 ZeroMQ 与 C# 和 inproc 传输一起使用 的相关文章

  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • 禁用所有操作的浏览器缓存,但保留捆绑包的浏览器缓存

    在我正在开发的 MVC 应用程序中 出于安全原因 我们必须阻止所有操作的浏览器缓存 防止用户在注销后返回历史记录 我们使用以下方法实现了这一点这个解决方案 https stackoverflow com a 5664481 2123652
  • 使用 SQL 将多个字段连接成一个

    我有三张桌子tag page pagetag 有了下面的数据 page ID NAME 1 page 1 2 page 2 3 page 3 4 page 4 tag ID NAME 1 tag 1 2 tag 2 3 tag 3 4 ta
  • 如何在 Quarkus 中处理大文件上传

    我的问题有两个 我正在寻找一种在 quarkus 应用程序服务器上实现分段文件上传的方法 该服务器允许程序员访问上传的文件 浏览文档似乎有https quarkus io guides rest client multipart https
  • 使用 VSCode“切换行注释”命令时更改注释符号位置

    是否可以在 VSCode 中自定义注释符号 使用 Python 时为 的位置 例如 如果我的代码是 def my func value 1 我在第 2 行按 CMD 我得到 def my func value 1 我更愿意得到 def my
  • 如何构建此 SQL 查询。合并多个表? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 注意 这不
  • C# Entity Framework 4.1 Lambda Include - 仅选择特定包含的值

    我正在 EF4 1 上执行 lambda select 包括当前语句中的另一个相关 DBSet return dbEntity GameTypes Include a gt a Draws Where d gt d IsActive tru
  • 使用意图从 Unity 应用程序向 Android 应用程序发送数据

    我有两个独立的应用程序 AppA 使用 Android Studio 开发 和 AppB 使用 Unity 开发 AppA 将启动 AppB 这是一个游戏应用程序 用户玩完游戏 AppB 并点击退出按钮后 会将游戏记录 字符串数组 发送回A
  • C/C++ 计算小数位数?

    假设用户输入的是十进制数 例如 5 2155 有 4 位小数 它可以自由存储 int double 等 有没有clever 或非常简单 找出数字有多少位小数的方法 有点像如何通过屏蔽最后一位来发现数字是偶数还是奇数的问题 我知道的两种方法
  • 从构造函数调用的shared_from_this

    我必须在创建对象时在容器中注册该对象 如果没有智能指针 我会使用这样的东西 a class a class register somewhere this 对于智能指针我应该使用shared from this但我不能在构造函数中使用它 有
  • 带可选参数的 TCL 过程调用

    存在一个 TCL 脚本 该脚本具有多个名称相似的过程定义func在不同的命名空间中 程序如下 proc func a puts a 所有这类程序都只有一个参数a 所有此类过程都是从整个脚本中的一行调用的 func a 我需要创建另一个具有相
  • 没有子导航属性的 EF 一对多外键

    使用代码优先的实体框架和 NET 4 我尝试在父母与孩子之间创建一对多关系 public class Parent Key public int ParentId get set Required public string ParentN
  • 使子视图与父滚动视图的宽度匹配

    我有一个带有许多 EditText 子项的水平滚动视图 我希望这些子级中的每一个都与父级滚动视图的可见区域具有相同的宽度 这在 XML 中可能吗 您可以编写一个小辅助类来做到这一点 我们正在创建一个非常小的类来扩展EditText call
  • Cypress 获取 href 属性

    我有一个测试用例 其中有一个在新选项卡中打开的链接 由于 Cypress 不支持多个选项卡 我想获得href该链接的属性 然后在同一选项卡中打开它 我正在尝试这样做 但由于某种原因它不起作用 it Advertise link should
  • ContextMenu 的 MenuItem DataContext 返回旧项目

    我在 LongListSelector 中使用 ContextMenu 以便可以删除绑定到 LLS 的列表中的一些项目 我正在遵循最近的指南here http www windowsphonegeek com articles the ne
  • 使用 Google 跟踪代码管理器等待 dataLayer.push()

    当用户按下网络中的按钮时 我必须发送谷歌标签管理器事件 事实上 这个按钮位于一个 iframe 内 单击后 该 iframe 被关闭 另一个 iframe 出现 我在 JavaScript 的点击事件上设置此事件数据 然后调用 dataLa
  • 在动画的 onFinished EventHandler 中使用 showAndWait 不起作用

    在JavaFx中 我想在动画结束后显示一个模式对话框 由于某种原因 在动画结束后执行的 EventHandler 中调用 showAndWait 不起作用 显示一个新窗口 但里面似乎没有绘制任何内容 这个例子说明了这个问题 public v
  • 如何使文本框适合表格单元格

    一直在尝试将文本框 自动调整文本框宽度 放入HTML表格的单元格中 但没有成功 任何人都可以帮忙吗 谢谢 我拥有的 td td
  • 创建所有节点具有相同入度和出度的矩阵

    我已经用图论术语阐述了这个问题 但概念化是不必要的 我想要做的是 使用 Python 生成一个由 0 和 1 组成的矩阵 其中每行都有相同数量的 1 每列都有相同数量的 1 当行数 发送节点 不等于列数 接收节点 时 行数将与列数不同 这是
  • FileProvider.getUriForFile 抛出 StringIndexOutOfBoundsException

    首先要提到的是 问题的答案here https stackoverflow com questions 47931146 fileprovider geturiforfile is causing stringindexoutofbound
  • 将 ZeroMQ 与 C# 和 inproc 传输一起使用

    我正在尝试 ZeroMQ 并试图得到某物在职的 我的第一个想法是使用 inproc 传输设置 REP REQ 看看是否可以在两个线程之间发送消息 下面的大部分代码取自 clzmq 示例 但它似乎不起作用 服务器和客户端都绑定到传输 但是当客