- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想构建一个基于 Erlang/OTP 的系统来解决“令人尴尬的并行”问题。
我已经阅读/浏览了:
最佳答案
我应该从几个带有主管的 gen_servers 开始,然后逐步构建吗?
你在这里错过了 Erlang 架构中的一个关键组件:应用程序! (即OTP应用的概念,不是软件应用)。
将应用程序视为组件。系统中的一个组件解决一个特定的问题,负责一组连贯的资源或从系统中抽象出一些重要或复杂的东西。
设计 Erlang 系统的第一步是决定需要哪些应用程序。有些可以按原样从网上提取,我们可以将这些称为库。其他你需要自己编写(否则你就不需要这个特定的系统)。我们通常将这些应用程序称为业务逻辑(通常您还需要自己编写一些库,但保持库与将所有内容联系在一起的核心业务应用程序之间的区别很有用)。
我应该有多少个主管?
对于要监控的每种流程,您都应该有一名主管。
一堆一模一样的临时工?一位主管来统治他们。
不同的流程有不同的职责和重启策略?每个不同类型进程的主管,在正确的层次结构中(取决于什么时候应该重新启动以及哪些其他进程需要与它们一起关闭?)。
有时将一堆不同的流程类型放在同一个主管下是可以的。当您有几个始终运行的单例进程(例如,一个 HTTP 服务器主管、一个 ETS 表所有者进程、一个统计信息收集器)时,通常就是这种情况。在这种情况下,为每个主管配备一名主管可能过于繁琐,因此通常会添加一位主管。在执行此操作时请注意使用特定重启策略的含义,因此您不要取消统计过程,例如,万一您的 Web 服务器崩溃(one_for_one
是在这种情况下最常用的策略) )。注意不要在 one_for_one
中的进程之间有任何依赖关系。导师。如果一个进程依赖于另一个崩溃的进程,它也会崩溃,触发监督者的重启强度过于频繁,监督者本身也会过早崩溃。这可以通过使用两个不同的主管来避免,这将通过配置的强度和周期( longer explanation )完全控制重新启动。
我如何决定系统的哪些部分应该基于流程?
系统中的每个并发事件都应该在它自己的进程中。错误的并发抽象是 Erlang 系统设计者一开始最常犯的错误。
有些人不习惯处理并发;他们的系统往往有太少。一个进程,或几个巨大的进程,按顺序运行所有内容。这些系统通常充满了代码异味,并且代码非常死板且难以重构。这也使它们变慢,因为它们可能不会使用 Erlang 可用的所有内核。
其他人立即掌握并发概念,但未能最佳地应用它们;他们的系统倾向于过度使用流程概念,使许多流程保持空闲等待其他正在工作的流程。这些系统往往过于复杂且难以调试。
本质上,在这两种变体中,您会遇到相同的问题,您没有使用所有可用的并发性,也没有从系统中获得最大性能。
如果你坚持 single responsibility principle并遵守规则,为系统中的每个真正并发的事件制定一个流程,您应该没问题。
有空闲进程是有正当理由的。有时他们保持重要状态,有时你想暂时保留一些数据然后丢弃进程,有时他们等待外部事件。更大的陷阱是通过一长串大部分不事件的进程传递重要消息,因为它会因大量复制而降低系统速度并使用更多内存。
我应该如何避免瓶颈?
很难说,很大程度上取决于你的系统和它在做什么。但是,通常情况下,如果您在应用程序之间有良好的职责分工,您应该能够将似乎是瓶颈的应用程序与系统的其余部分分开扩展。
这里的黄金法则是测量,测量,再测量!在您进行测量之前,不要认为您有什么需要改进的地方。
Erlang 的伟大之处在于它允许您将并发隐藏在接口(interface)后面(称为隐式并发)。比如你使用一个功能模块API,一个普通的module:function(Arguments)
接口(interface),这反过来可以产生数千个进程,而调用者不必知道。如果您的抽象和 API 正确,您可以在开始使用库后对其进行并行化或优化。
话虽如此,这里有一些一般指导方针:
logger:error("The file does not exist: ~ts",[Filename]),
logger:notice("Something strange happened!"),
logger:debug(#{got => connection_request, id => Id, state => State},
#{report_cb => fun(R) -> {"~p",[R]} end}),
关于architecture - 你如何设计一个基于 Erlang/OTP 的分布式容错多核系统的架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7307634/
人们在运行TwistedWeb服务器时使用哪些技术来利用多个处理器/内核?有推荐的方法吗? 我基于twisted.web的Web服务在Amazon EC2实例上运行,该实例通常具有多个CPU核心(8、
multicore 库中是否有类似 sapply 的东西?还是我必须 unlist(mclapply(..)) 才能实现这一点? 如果它不存在:推理是什么? 提前致谢,如果这是一个愚蠢的问题,我们深表
ZeroMQ 用于接收输入参数.. def server(): rep = context.socket(zmq.REP) rep.bind('tcp://*:{}'.format(P
我有一大组标量值分布在 3D 网格上(每个顶点一个值。) 我的目标是展示: 网格中值大于阈值的所有点。 并将连接的点分组(以简化显示。) 所以我的基本解决方案是: 找到通过阈值测试的点 对于每个没有被
作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功、JAVA底层、面试、职业成长相关资料等更多精彩文章在公众号「 小牛呼噜噜 」 。 大家好,我是呼噜噜,
有没有办法让 J 使用多个核心?我认为 APL/J 的部分好处是语言结构很适合并行解决方案。 查看我的 CPU 使用率(我在 OSX 上),显然只有一个处理器在使用。 我有一个很重的函数 f 作用在一
多核处理器如何处理中断。 我知道单核处理器如何处理中断。 我也知道不同类型的中断。 我想知道多核处理器如何处理硬件、程序、cpu时序和输入/输出中断 最佳答案 这应该被视为 other answer
很长一段时间以来,我一直将 LLVM 视为我目前正在实现的语言的新后端。它似乎具有良好的性能,相当高级的生成 API,足够的低级支持来优化奇特的优化。此外,虽然我自己没有检查过,但苹果似乎已经成功地演
我最近开始研究低级OS编程。我(非常缓慢)目前正在研究两本较旧的书,即XINU和Build Your Own 32 Bit OS,以及上一个问题How to get started in operat
我正在阅读对新英特尔凌动 330 的评论,他们指出任务管理器显示 4 个内核 - 两个物理内核,另外还有两个由超线程模拟。 假设您有一个包含两个线程的程序。还假设这些是在 PC 上执行任何工作的唯一线
我不知道如何在 C++ 中进行线程化,我不仅不想知道,而且有没有一种方法可以将线程强制到不同的核心上?另外,我如何才能知道用户拥有多少个内核? 最佳答案 将线程绑定(bind)到任意 CPU 称为设置
如果需要在多核处理器机器的多个内核上并行执行,Linux 内核是否会同时执行多个上下文切换?有引用吗? 最佳答案 是的,你是对的。在 SMP 系统上,多个上下文切换同时发生。每个核心都可以独立进行上下
与进程相比,线程更不可能从多核处理器中获益,这是真的吗?换句话说,内核会决定在单核而不是多核上执行线程吗? 我说的是属于同一进程的线程。 最佳答案 我不知道(各种)Linux 调度程序如何处理这个问题
我需要一些帮助来决定在单个 Solr 实例中创建单个索引还是在单个 Solr 实例中创建多个核心,每个核心为一个索引提供服务。 我的理解是,solr 中的单个索引通常用于索引一种类型的文档。当您有不同
NGINX 或 Apache 是否受益于具有以下任一项的服务器: 多核,或者 多个处理器? 如果是,为什么? 最佳答案 使用多个 CPU/CPU 内核使服务器应用程序有机会并行处理多个客户端连接(和请
我正在为我的爱好操作系统开发 CPU 检测和一般环境检测代码。是否存在需要多次调用 CPUID 的情况?也就是说如果系统有多个核心,操作系统是否需要在每个核心上调用CPUID? NUMA 也是如此。
我有一些关于多核 CPU 或多处理器系统中使用的高速缓存存储器的问题。 (虽然与编程没有直接关系,但当一个人为多核处理器/多处理器系统编写软件时,它会产生很多影响,因此在此询问!) 在多处理器系统或多
所以,我一直在使用 opencv 开发实时跟踪系统。几天前,我不得不开始使用 directshow(这对我来说是全新的),因为我需要网络摄像头的更高分辨率。分辨率越高,CPU 使用率就越高。仅使用没有
我经常听说其他语言被提升为更适合多核/并发编程,例如Clojure、Scala、Erlang 等,但我有点困惑为什么我需要担心多核问题,Java/.NET VM 不应该自动处理吗?如果没有,背后的原因
假设 x86 多核 PC 架构... 假设有 2 个内核(能够执行 2 个单独的指令流),并且 CPU 和 RAM 之间的接口(interface)是内存总线。 调度在 2 个不同内核上的 2 条指令
我是一名优秀的程序员,十分优秀!