如何分析qlc:q是执行全表扫描,键前缀扫描还是键查找?
例如,使用{{KeyPrefix,KeySuffix},Value}等条目设置的类型的ets将会
qlc:q([
{{KeyPrefix, KeySuffix}, Value} ||
{{KeyPrefix, KeySuffix}, Value} <- ets:table(Table),
KeyPrefix =:= Something
])
Run Code Online (Sandbox Code Playgroud)
进行全表扫描或键前缀扫描?
免责声明:我对Erlang和OTP很新.
我想在Erlang/OTP中使用一个简单的pubsub,其中进程可以在某个"集线器"订阅并接收发送到该集线器的消息副本.
我知道gen_event,但它在一个事件管理器进程中处理事件,而我希望每个订阅者都是一个独立的自治进程.而且,我无法理解gen_event处理程序的监督.不幸的是,谷歌的结果充满了XMPP(Ejabberd)和RabbitMQ链接,所以我没有发现任何与我的想法相关的内容.
我的想法是这样的pubsub模型无缝映射到监督树.因此,我想扩展主管(gen_server引擎盖下),以便能够向其所有孩子发送演员信息.
我在快速而肮脏的自定义"调度程序"行为中攻击了这个:
-module(dispatcher).
-extends(supervisor).
-export([notify/2, start_link/2, start_link/3, handle_cast/2]).
start_link(Mod, Args) ->
gen_server:start_link(dispatcher, {self, Mod, Args}, []).
start_link(SupName, Mod, Args) ->
gen_server:start_link(SupName, dispatcher, {SupName, Mod, Args}, []).
notify(Dispatcher, Message) ->
gen_server:cast(Dispatcher, {message, Message}).
handle_cast({message, Message}, State) ->
{reply, Children, State} = supervisor:handle_call(which_children, dummy, State),
Pids = lists:filter(fun(Pid) -> is_pid(Pid) end,
lists:map(fun({_Id, Child, _Type, _Modules}) -> Child end,
Children)),
[gen_server:cast(Pid, Message) || Pid <- Pids],
{noreply, State}.
Run Code Online (Sandbox Code Playgroud)
然而,虽然一切看起来一切正常(儿童接收消息并在失败时无缝重启),但我想知道这是个好主意.
请某人批评(或批准)我的方法,和/或推荐一些替代方案吗?
Ada有哪些RTOS可以使用开源/免费交叉编译器,支持多任务/多线程?
我有一个Atmel AT90USB162芯片,我想用Ada编程.我的第一个选择是使用AVR-Ada对其进行编程,但由于它没有任务支持,因此它是不可选择的(现在我对如何支持其任务转移没有任何线索).所以我需要一个更强大的方法.我想过使用QNX,但它比我的芯片架还要复杂得多.
我得到了AVR芯片支持uC/OS-II和FreeRTOS的信息.FreeRTOS或uC/OS-II有免费的Ada交叉编译器吗?
谢谢.
不满意我目前的方法我只是想重新设计我在Erlang中构建协议栈的方式.按重要性排序的功能:
性能
灵活性和实施速度增加了新的协议变体
从shell开始探索协议变体将有助于开发
我现在的模型(在这个问题中描述的alreday)除了函数调用和消息接收的send()的丑陋不对称之外,正在达到极限.
整个协议引擎的整体情况如下所示:
在每个堆栈的底部有几个端口或者有时也可能是gen_tcp(独立通道有多个相同的堆栈,所以我们不能在这里注册流程太静态,必须在任何地方传递Pids.
在端口之上是一些由主管管理的模块(从系统开始并且在没有错误的情况下保持整个生命周期).
由事件发生触发(在一般意义上不在event_handler意义上)是面向连接的协议结束(例如,具有connect()和close()语义.
协议栈的最高端可能只能动态启动,因为堆叠在一起以形成堆栈的模块是动态可配置的,并且可能会从连接变为连接.
目前计划将传递一个模块名称列表+来自顶层的可选参数,这些参数在connect()被调用时被消耗掉.
Toplevel进程将被链接,因此当出现任何错误时,整个连接都会失败.
到目前为止,发现了几种模块:
无状态过滤器模块
具有状态的模块,一些适合gen_server,一些gen_fsm但大多数可能是简单的服务器循环,因为选择性接收将非常有用并且经常简化代码.
层之间的通信类型:
独立发送和接收数据包(从外部看独立)
发送内容的同步调用,阻塞直到有答案,然后将结果作为返回值返回.
对多个模块进行对话的多路复用器(这是我在这里的定义以便于讨论)
具有不同附着点(当前由原子命名)的解复用器与面向上的模块通信.
目前我唯一的解复用器位于堆栈的静态底部,而不是动态创建的顶部.多路复用器目前仅位于顶部.
在我之前链接的问题处理的答案和评论中,我听说API通常只包含函数而不是消息,除非另有说服,否则我同意这一点.
请原谅问题的冗长解释,但我认为它仍然适用于各种协议实现.
我将在答案中编写我迄今为止计划的内容,并且还将在稍后解释最终的实现和我的经验,以便在此处实现一些有用的东西.
在erlang中,可以创建一个与进程不对应的pid.使用这样的例子可以发现这里在了解你一些二郎.
pid(0,250,0).
Run Code Online (Sandbox Code Playgroud)
有没有办法在长生不老药中做同样的事情?我目前关闭的是创建一个立即终止并使用该pid的进程.
fake_pid = Process.spawn(fn -> end)
Run Code Online (Sandbox Code Playgroud)
这种接缝就像是一个黑客,我不确定从未创建的pid和死pid之间是否会有一些细微的差别.
在ExProf中,Elixir函数名称在编译后打印出我假设的Erlang名称.一个例子是
Enum.reduce/3
Run Code Online (Sandbox Code Playgroud)
印刷为
'Elixir.Enum':'-reduce/3-lists^foldl/2-0-'/3
Run Code Online (Sandbox Code Playgroud)
我该如何解析这个字符串?这个-lists^foldl/2-0-部分来自哪里?为什么有多个/3?为什么有些名字有-前缀?什么^意思?为什么2-0-?
我已经习惯用pc来开发erlang程序,一个是mac os x 10.6,另一个是mac os x 10.7.
在".emacs"两个pc的文件中,它包含以下脚本
;;handle emacs utf-8 input
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(prefer-coding-system 'utf-8)
Run Code Online (Sandbox Code Playgroud)
但是当我在一台电脑中输入包含汉字的备注并保存,然后下载到另一台电脑.中文字符无法正确显示.反向操作的相同故事.
我想知道如何检查当前文件的编码类型?有没有命令可以做到这一点?
所以我想知道是否有任何库可以用于凤凰框架的全文搜索?我试图谷歌的东西,即使在erlang,但发现只有一些非常古老的库......
我正在Elixir建立一个工作队列作为学术练习.目前,我的工作人员在创建队列时必须手动注册队列(请参阅参考资料MyQuestion.Worker.start_link).
我希望我的主管在创建/重新启动时向队列中注册可用的工作人员,因为这似乎有助于测试工作人员并最大限度地减少耦合.
有没有办法做我在下面的代码中描述的内容MyQuestion.Supervisor?
defmodule MyQuestion.Supervisor do
use Supervisor
def start_link do
supervisor = Supervisor.start_link(__MODULE__, :ok)
end
def init(:ok) do
children = [
worker(MyQuestion.JobQueue, []),
worker(MyQuestion.Worker, [], id: :worker_0),
worker(MyQuestion.Worker, [], id: :worker_1)]
supervise(children, strategy: :rest_for_one)
end
# LOOKING FOR SOMETHING LIKE THIS
# on worker spawn, I want to add the worker to the queue
def child_spawned(pid, {MyQuestion.Worker, _, _}) do
# add worker to queue
MyQuestion.JobQueue.add_new_worker(pid)
end
# LOOKING FOR SOMETHING LIKE THIS
# I …Run Code Online (Sandbox Code Playgroud) 假设我有一个巨大的文本体~500个字符存储在一个字符串中,我怎样才能遍历字符串并在每次遇到字符'a'时将变量增加1?