小编Pee*_*ger的帖子

Erlang:如何分析qlc:q是执行全表扫描,键前缀扫描还是键查找?

如何分析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 profiling

9
推荐指数
1
解决办法
333
查看次数

Erlang:进程的简单pubsub - 我的方法好吗?

免责声明:我对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)

然而,虽然一切看起来一切正常(儿童接收消息并在失败时无缝重启),但我想知道这是个好主意.

请某人批评(或批准)我的方法,和/或推荐一些替代方案吗?

erlang erlang-otp extending publish-subscribe

9
推荐指数
2
解决办法
3491
查看次数

开源交叉编译器支持Ada多任务RTOS

Ada有哪些RTOS可以使用开源/免费交叉编译器,支持多任务/多线程?

我有一个Atmel AT90USB162芯片,我想用Ada编程.我的第一个选择是使用AVR-Ada对其进行编程,但由于它没有任务支持,因此它是不可选择的(现在我对如何支持其任务转移没有任何线索).所以我需要一个更强大的方法.我想过使用QNX,但它比我的芯片架还要复杂得多.

我得到了AVR芯片支持uC/OS-II和FreeRTOS的信息.FreeRTOS或uC/OS-II有免费的Ada交叉编译器吗?

谢谢.

avr rtos ada cross-compiling rtems

9
推荐指数
3
解决办法
2308
查看次数

如何设计灵活的Erlang协议栈创建API

不满意我目前的方法我只是想重新设计我在Erlang中构建协议栈的方式.按重要性排序的功能:

  1. 性能

  2. 灵活性和实施速度增加了新的协议变体

  3. 从shell开始探索协议变体将有助于开发

我现在的模型(在这个问题中描述的alreday)除了函数调用和消息接收的send()的丑陋不对称之外,正在达到极限.

整个协议引擎的整体情况如下所示:

底部:

  • 在每个堆栈的底部有几个端口或者有时也可能是gen_tcp(独立通道有多个相同的堆栈,所以我们不能在这里注册流程太静态,必须在任何地方传递Pids.

  • 在端口之上是一些由主管管理的模块(从系统开始并且在没有错误的情况下保持整个生命周期).

上半部分:

  • 由事件发生触发(在一般意义上不在event_handler意义上)是面向连接的协议结束(例如,具有connect()close()语义.

  • 协议栈的最高端可能只能动态启动,因为堆叠在一起以形成堆栈的模块是动态可配置的,并且可能会从连接变为连接.

  • 目前计划将传递一个模块名称列表+来自顶层的可选参数,这些参数在connect()被调用时被消耗掉.

  • Toplevel进程将被链接,因此当出现任何错误时,整个连接都会失败.

模块的类型和它们之间的通信类型

到目前为止,发现了几种模块:

  • 无状态过滤器模块

  • 具有状态的模块,一些适合gen_server,一些gen_fsm但大多数可能是简单的服务器循环,因为选择性接收将非常有用并且经常简化代码.

层之间的通信类型:

  • 独立发送和接收数据包(从外部看独立)

  • 发送内容的同步调用,阻塞直到有答案,然后将结果作为返回值返回.

  • 对多个模块进行对话的多路复用器(这是我在这里的定义以便于讨论)

  • 具有不同附着点(当前由原子命名)的解复用器与面向上的模块通信.

目前我唯一的解复用器位于堆栈的静态底部,而不是动态创建的顶部.多路复用器目前仅位于顶部.

在我之前链接的问题处理的答案和评论中,我听说API通常只包含函数而不是消息,除非另有说服,否则我同意这一点.

请原谅问题的冗长解释,但我认为它仍然适用于各种协议实现.

我将在答案中编写我迄今为止计划的内容,并且还将在稍后解释最终的实现和我的经验,以便在此处实现一些有用的东西.

erlang protocols erlang-otp

8
推荐指数
1
解决办法
732
查看次数

在长生不老药中创造假或虚拟的pid

在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之间是否会有一些细微的差别.

pid process elixir

8
推荐指数
2
解决办法
2052
查看次数

如何理解编译的Elixir Erlang函数名

在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-

elixir

8
推荐指数
1
解决办法
424
查看次数

Emacs:当前缓冲区的编码系统

我已经习惯用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)

但是当我在一台电脑中输入包含汉字的备注并保存,然后下载到另一台电脑.中文字符无法正确显示.反向操作的相同故事.

我想知道如何检查当前文件的编码类型?有没有命令可以做到这一点?

emacs character-encoding

7
推荐指数
1
解决办法
1864
查看次数

全文搜索凤凰框架

所以我想知道是否有任何库可以用于凤凰框架的全文搜索?我试图谷歌的东西,即使在erlang,但发现只有一些非常古老的库......

elixir phoenix-framework

7
推荐指数
1
解决办法
1727
查看次数

检测Elixir/OTP主管儿童产卵和终止

我正在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)

elixir erlang-otp

7
推荐指数
1
解决办法
982
查看次数

如何在Elixir中循环遍历字符串中的每个字符?

假设我有一个巨大的文本体~500个字符存储在一个字符串中,我怎样才能遍历字符串并在每次遇到字符'a'时将变量增加1?

string loops functional-programming elixir

7
推荐指数
2
解决办法
5717
查看次数