- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对我当前的方法不满意,我只是尝试重新设计在 Erlang 中构建协议(protocol)栈的方式。按重要性排序的功能:
性能
添加新协议(protocol)变体的灵 active 和实现速度
这将有助于开发从 shell 探索协议(protocol)变体
除了通过函数调用的 send() 和通过消息接收的丑陋的不对称性之外,我当前的模型 ( alreday described in this question ) 已达到其极限。
整个协议(protocol)引擎的整体图是这样的:
每个堆栈的底部有多个端口,或者有时可能有一个 gen_tcp(独立 channel 有多个相同的堆栈,因此我们不能在这里过于静态地注册进程,必须在各处传递 Pids。
端口顶部是一些由主管管理的模块(随系统启动,并且在整个生命周期内没有错误)。
由事件发生触发(一般意义上不是 event_handler 意义上的)是面向连接的协议(protocol)端(例如使用 connect()
和 close()
语义。
协议(protocol)栈的顶端可能只能动态启动,因为堆叠在一起形成堆栈的模块是动态可配置的,并且可能会因连接而异。
当前计划将传递一个模块名称列表 + 可选参数,这些参数会在堆栈中调用 connect()
时使用。
顶级进程将被链接,因此当此处出现任何问题时,整个连接都会失败。
目前发现的模块有以下几种:
无状态过滤模块
带有状态的模块,有些适合 gen_server,有些适合 gen_fsm,但大多数可能是简单的服务器循环,因为选择性接收很有用,并且经常简化代码。
层之间的通信类型:
独立发送和接收数据包(从外部看是独立的)
同步调用发送一些内容,阻塞直到有答案,然后将结果作为返回值返回。
与多个模块对话的多路复用器(这是我的定义,以方便讨论)
解复用器具有不同的连接点(当前由原子命名),可与向上的模块进行通信。
目前,我唯一的解复用器位于堆栈的静态底部,而不是动态创建的顶部。多路复用器目前仅位于顶部。
在我之前链接的问题处理的答案和评论中,我听说 API 通常应该只包含函数而不是消息,除非另有说服力,否则我同意这一点。
请原谅这个问题的冗长解释,但我认为它仍然普遍用于各种协议(protocol)实现。
我将在答案中写下到目前为止我计划的内容,并且还将解释最终的实现以及我稍后的经验,以便在这里实现一些普遍有用的东西。
最佳答案
我将添加到目前为止我计划的内容作为答案的一部分:
connect 传递了一个要堆栈的模块列表,在参数的情况下看起来像一个 proplist,例如:
connect([module1, module2, {module3, [params3]}], param0, further_params)
每一层剥离头部并调用下一层连接。
connect()
“以某种方式”向上和/或向下层传递有趣的引用
多路复用器路由列表可能如下所示
connect([module1, multiplexer, [[m_a_1, m_a_2, {m_a_3, [param_a_3]}],
[m_b_1, m_b_2],
[{m_c_1, [param_c_1]}, m_c_2]], param0,
further_params]).
目前我决定不会有额外的同步调用函数,我只是使用 send 来实现。
在这种情况下,有一个无状态模块的想法的实现示例:encode/1
和 decode/1
对数据包进行一些 for 和 back 转换,例如将二进制表示解析为记录并返回:
connect(Chan, [Down|Rest], [], Recv_fun) ->
{Down_module, Param} = case Down of
{F, P} -> {F, P};
F when is_atom (F) -> {F, []}
end,
Send_fun = Down_module:connect(Chan, Rest, Param,
fun(Packet) -> recv(Packet, Recv_fun) end),
{ok, fun(Packet) -> send(Packet, Send_fun) end}.
send(Packet, Send_fun) ->
Send_fun(encode(Packet)).
recv(Packet, Recv_fun) ->
Recv_fun(decode(Packet)).
一旦我有了一个有状态的示例,我也会发布它。
关于erlang - 如何设计灵活的Erlang协议(protocol)栈创建API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4059746/
我有以下几行代码: using XXX.PAD.PaidServices; using YYY= XXX.PAD.PaidServices.Judet; //// uncomment below fo
我正在寻找一种方法,让 LAN 中的客户端无需任何配置即可找到我的服务器应用程序的所有实例。我不想自己破解某些东西,而是想使用现有的解决方案。就个人而言,我需要用 Python 完成它,但我很乐意听到
我的“问题”或“挑战”有很多问题。但它们都不符合我的需求。好的,我开始了: 我想要一个保存可变属性的数据库。现在我将它们作为列名“硬编码”到数据库中(参见图片)。请参阅“颜色”和“尺寸”。但是如果我想
我正在为我的一个 friend 创建一个网站。我们得到了这些布局,我已经放了一个灵活的背景,可以缩放到当前的浏览器大小。但是放置在背景上的图标需要在缩放窗口时保持相对位置。意味着如果我调整窗口大小,让
案例 通常,您会使用 cellForRowAtIndexPath 委托(delegate)方法来设置单元格。单元格的信息集对于单元格的绘制方式和大小非常重要。 不幸的是,heightForRowAtI
我试图让下面的 div 变得灵活 div { min-width: 500px; max-width: 1000px; width:100%; height: 400px; margin-left:1
我在单元测试方面遇到问题。当我运行测试时,它以 "No tests found" 结束。我正在使用 AppCode 和 Quick/Nimble 框架进行单元测试,但它在 XCode 中也不起作用。
问之前,请理解我的英语不好。 我在 servlet 编程中使用 Class.forName(...) 类。当我访问 servlet 时,我从数据库中获得一行详细的 Controller 信息,指示要使
我创建了一个cron job在 GAE 灵活环境中,每 15 分钟自动运行一次。 但是在创建每个实例时,是否会为每个实例复制相同的 cron 作业?我对此不太确定。 最佳答案 不,不会为每个实例复制
div A 灵活且固定(位于窗口顶部),具有高 z-index,因此下方的元素可以在滚动时从下方通过。 div B 位于 div A 下方,我希望它“粘”在 div A 的底部,因为在调整窗口大小时高
我是 Quick/Nimble 的新手,所以我尝试了一个简单的单元测试: import Quick import Nimble class DarkSkyTests: QuickSpec {
我创建了一个演示。关于表格单元格的灵 active ,我需要一些帮助。 我有一些表格单元格,它们的宽度应该是固定的。 但单元格由标签组成,标签可以是长文本,也可以是短文本。 基于此标签,表格单元格应该
我非常熟悉在代码中需要“水平带”的网站 - 即使他们的内容固定在 960 像素以内,他们的背景也会向左和向右“延伸”。 我知道如何做这些,如果它们只有一种颜色,或者我可以用作背景的一张图片。 最近一位
我在自己编写的网站(无框架或 CMS)上使用 Cloudflare Flexible SSL。一切正常,现在我想在整个网站上使用 HTTPS。我在 Apache Web 服务器上使用 PHP。 我想知
我有这个 Java 接口(interface): public interface Box { public void open(); public void close(); } 这个接
所以我有一个“主要”功能系统,现在可以作为 CMS 使用:用户进入编辑器并从四个模板中选择一个。在模板中,他们单击可以添加图像、文本或两者的部分。 我有一个预览屏幕,可以向他们展示他们正在制作的东西,
下面的 HTML/CSS/Javascript (jQuery) 代码显示了 #makes 选择框。选择一个选项会显示带有相关选项的 #models 选择框。 #makes 选择框偏离中心,#mode
我正在使用固定高度的图像来填充具有渐变颜色的 div,方法如下:背景:透明 url(green_bg.gif) repeat-x scroll 0 0; 但是它只填充一个等于图像高度的高度。根据其中的
我的系统的 GUI 在 1366 X 768 分辨率下运行良好。当它以不同的分辨率显示时,我需要并排滚动,而它不应该这样。此外,当我尝试在 chrome 中按 ctr+- 时,div 和部分变得困惑。
我正在尝试在 google app engine 灵活环境中使用 python 编写日志。 我想使用默认的 python 日志记录库并使用处理程序进行日志记录。这是我的代码: import loggi
我是一名优秀的程序员,十分优秀!