- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我为ZeroMQ设置了wrote a test,以说服自己,它能够独立于处理顺序将回复映射到客户端,这将证明它是线程安全的。
它是一个多线程服务器,仅将接收到的消息返回给发件人。客户端从多个线程发送一些消息,并检查是否收到了相同的消息。对于多线程,我使用OpenMP。
该测试工作正常,我想继续使用zerotQ的ojit_a重新实现它。现在,它不再以相同的方式工作。
这是ZMQPP的代码:
#include <gtest/gtest.h>
#include <zmqpp/zmqpp.hpp>
#include <zmqpp/proxy.hpp>
TEST(zmqomp, order) {
zmqpp::context ctx;
std::thread proxy([&ctx] {
zmqpp::socket dealer(ctx, zmqpp::socket_type::xrequest);
zmqpp::socket router(ctx, zmqpp::socket_type::xreply);
router.bind("tcp://*:1234");
dealer.bind("inproc://workers");
zmqpp::proxy(router, dealer);
});
std::thread worker_starter([&ctx] {
#pragma omp parallel
{
zmqpp::socket in(ctx, zmqpp::socket_type::reply);
in.connect("inproc://workers");
#pragma omp for
for (int i = 0; i < 1000; i++) {
std::string request;
in.receive(request);
in.send(request);
}
}
});
std::thread client([&ctx] {
#pragma omp parallel
{
zmqpp::socket out(ctx, zmqpp::socket_type::request);
out.connect("tcp://localhost:1234");
#pragma omp for
for (int i = 0; i < 1000; i++) {
std::string msg("Request " + std::to_string(i));
out.send(msg);
std::string reply;
out.receive(reply);
EXPECT_EQ(reply, msg);
}
}
});
client.join();
worker_starter.join();
ctx.terminate();
proxy.join();
}
#pragma
,发现只有一个更改可以“修复”它:
//#pragma omp parallel for
for (int i = 0; i < 250; i++) {
最佳答案
序言:ZeroMQ是按定义和设计的,不是线程安全的。
通常,这并不重要,因为有一些安全的设计方法,但是一旦遵循了建议的 TEST(){...}
设计,这里的情况就更糟了。
与ZeroMQ一起度过了一段时间之后,您的提案由于违反了几项主要原则而大吃一惊,否则,它们将使分布式架构比单片代码的纯 SEQ
更智能地工作。
ZeroMQ在(几乎)每三段中说服避免共享资源。 零共享是ZeroMQ出色的可扩展性能和最小化的延迟最大化之一,简而言之。
因此,最好完全避免共享 zmq.Context()
实例(除非人们非常了解,为什么以及如何在后台运行)。
因此,尝试并行触发1000次(几乎)(不是真正的 PAR
)将一些事件流发送到zmq.Context
的共享实例上(使用默认参数实例化且没有性能调整适应的事件越少)肯定会遭受与建议的性能和设计相反的工作。
有哪些制约因素,而不是 flutter 朔迷离?
1)每个zmq.Context()
实例都有数量有限的I / O线程,这些线程是在实例化过程中创建的。一旦合理的设计需要一些性能调整,就有可能增加这样的I / O线程数,并且数据泵将更好地工作(当然,没有任何数量的数据泵可以挽救不良的设计,灾难性的设计就越少) /分布式计算系统的体系结构()。
2)每个zmq.Socket()
实例都有一个{显式}映射到相应的I / O线程( Ref. 1) )。一旦合理的设计需要增强的鲁棒性,以应对缓慢的事件循环处理或数据流 Storm (或负载平衡,或您所说的)引起的其他不利影响,就有机会受益于分而治之的方法使用 .setsockopt( zmq.AFFINITY, ... )
方法将每个zmq.Socket()
实例直接映射到各自的I / O线程,从而在实际操作期间始终控制哪些缓冲和内部队列为哪些资源而战。在任何情况下,如果线程总数超过了本地主机的内核数,那么 just-CONCURRENT调度就很明显(因此,梦见真正的 PAR
执行梦想基本上是无意间丢失的。 )。
3)每个zmq.Socket()
还具有一对“隐藏队列破坏者” ,称为高水印。这些设置要么{隐式|明确地},后者无疑是性能调整的更明智的方式。为什么要破坏者?因为这些可以稳定并保护分布式计算系统免于溢出,并且允许简单地丢弃 HWM
级别以上的每条消息,以保护系统即使在 Storm 下也能永远运行,虚假爆炸数据包或DDoS类型的攻击。有许多工具可用于调整ZeroMQ Context()实例的行为的这一域,这超出了此答案的范围(请参阅:我在ZeroMQ AFFINITY
上的其他文章或.setsockopt()
方法中使用的ZeroMQ API规范)。
4)每个基于tcp://
传输类的zmq.Socket()
实例还继承了一些与O / S相关的遗产。一些操作系统通过扩展IP数据包(在任何ZeroMQ控件之外)直至达到某个阈值,来证明存在这种风险,因此应谨慎设计此类情况,以避免对预期的应用程序信令产生不利影响/消息传递动态和健壮性,以应对这种不可控制的(外部系统)缓冲习惯。
5)每个 .recv()
和 .send()
方法调用都是按定义阻塞的,这是大规模分布式计算系统永远都不应冒险的事情。永远不能。即使以教科书为例。而是使用这些调用的非阻塞形式。总是。 这被授予。
6)每个zmq.Socket()
实例都应执行一组仔细而优雅的终止步骤。预防性的步骤 .setsockopt( zmq.LINGER, 0 )
+一个显式的 .close()
方法被公平地包含在每个用例中(并且无论是否出现任何异常,都具有很强的执行力)。穷人{自我|这种做法的团队纪律是,这肯定会使整个应用程序基础架构挂断,因为只是没有对强制性的资源管理策略给予应有的关注。这是任何严肃的分布式计算项目的必备部分。甚至教科书的例子也应该有这个。没有异常(exception)。别找借口。 这被授予。
关于c++ - 零MQ与C++绑定(bind)和Open MP阻止问题。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43749274/
关闭。这个问题是off-topic .它目前不接受答案。 想要改进这个问题? Update the question所以它是on-topic用于堆栈溢出。 关闭 12 年前。 Improve thi
我有一个动态网格,其中的数据功能需要正常工作,这样我才能逐步复制网格中的数据。假设在第 5 行中,我输入 10,则从第 6 行开始的后续行应从 11 开始读取,依此类推。 如果我转到空白的第一行并输入
我有一个关于我的按钮消失的问题 我已经把一个图像作为我的按钮 用这个函数动画 function example_animate(px) { $('#cont
我有一个具有 Facebook 连接和经典用户名/密码登录的网站。目前,如果用户单击 facebook_connect 按钮,系统即可运行。但是,我想将现有帐户链接到 facebook,因为用户可以选
我有一个正在为 iOS 开发的应用程序,该应用程序执行以下操作 加载和设置注释并启动核心定位和缩放到位置。 map 上有很多注释,从数据加载不会花很长时间,但将它们实际渲染到 map 上需要一段时间。
我被推荐使用 Heroku for Ruby on Rails 托管,到目前为止,我认为我真的会喜欢它。只是想知道是否有人可以帮助我找出问题所在。 我按照那里的说明在该网站上创建应用程序,创建并提交
我看过很多关于 SSL 错误的帖子和信息,我自己也偶然发现了一个。 我正在尝试使用 GlobalSign CA BE 证书通过 Android WebView 访问网页,但出现了不可信错误。 对于大多
我想开始使用 OpenGL 3+ 和 4,但我在使用 Glew 时遇到了问题。我试图将 glew32.lib 包含在附加依赖项中,并且我已将库和 .dll 移动到主文件夹中,因此不应该有任何路径问题。
我已经盯着这两个下载页面的源代码看了一段时间,但我似乎找不到问题。 我有两个下载页面,一个 javascript 可以工作,一个没有。 工作:http://justupload.it/v/lfd7不是
我一直在使用 jQuery,只是尝试在单击链接时替换文本字段以及隐藏/显示内容项。它似乎在 IE 中工作得很好,但我似乎无法让它在 FF 中工作。 我的 jQuery: $(function() {
我正在尝试为 NDK 编译套接字库,但出现以下两个错误: error: 'close' was not declared in this scope 和 error: 'min' is not a m
我正在使用 Selenium 浏览器自动化框架测试网站。在测试过程中,我切换到特定的框架,我们将其称为“frame_1”。后来,我在 Select 类中使用了 deselectAll() 方法。不久之
我正在尝试通过 Python 创建到 Heroku PostgreSQL 数据库的连接。我将 Windows10 与 Python 3.6.8 和 PostgreSQL 9.6 一起使用。 我从“ht
我有一个包含 2 列的数据框,我想根据两列之间的比较创建第三列。 所以逻辑是:第 1 列 val = 3,第 2 列 val = 4,因此新列值什么都没有 第 1 列 val = 3,第 2 列 va
我想知道如何调试 iphone 5 中的 css 问题。 我尝试使用 firelite 插件。但是从纵向旋转到横向时,火石占据了整个屏幕。 有没有其他方法可以调试 iphone 5 中的 css 问题
所以我有点难以理解为什么这不起作用。我正在尝试替换我正在处理的示例站点上的类别复选框。我试图让它做以下事情:未选中时以一种方式出现,悬停时以另一种方式出现(选中或未选中)选中时以第三种方式出现(而不是
Javascript CSS 问题: 我正在使用一个文本框来写入一个 div。我使用以下 javascript 获取文本框来执行此操作: function process_input(){
你好,我很难理解 P、NP 和多项式时间缩减的主题。我试过在网上搜索它并问过我的一些 friend ,但我没有得到任何好的答案。 我想问一个关于这个话题的一般性问题: 设 A,B 为 P 中的语言(或
你好,我一直在研究 https://leetcode.com/problems/2-keys-keyboard/并想到了这个动态规划问题。 您从空白页上的“A”开始,完成后得到一个数字 n,页面上应该
我正在使用 Cocoapods 和 KIF 在 Xcode 服务器上运行持续集成。我已经成功地为一个项目设置了它来报告每次提交。我现在正在使用第二个项目并收到错误: Bot Issue: warnin
我是一名优秀的程序员,十分优秀!