小编Sha*_*ras的帖子

node.js的内部.它是如何实际工作的

也许实现node.js模块的人可以解释在单个线程上处理的node.js队列和将由模块执行的阻塞IO操作之间的协议.

我怀疑它是这样的:

  1. node.js线程以闭包的形式注册一个回调,并用一些相关id保存它.
  2. node.js在模块上调用一个方法(应该执行阻塞IO),并将方法参数和相关ID传递给它.
  3. 模块方法旋转一个线程并阻止IO操作.
  4. 当IO操作完成时,模块的线程调用回node.js线程并将结果和相关ID传递给它.
  5. node.js线程按相关ID查找存储的回调闭包,并使用从模块返回的结果调用它.

问题1:上述顺序是否正确?

问题2: node.js队列究竟是什么?它是使用Windows上的epoll,kqueue或IO完成端口的部分吗?它是一个模块的回调机制,通知node.js线程有些IO已经完成了吗?它是如何工作的?

internals node.js

18
推荐指数
2
解决办法
4262
查看次数

如果Node必须具有与客户端节点相同的模块,那么在erlang上Spawn(Node,Fun)有什么意义呢?

为什么要创建一个幻觉,您正在向远程节点发送Fun以在新进程中执行?如果客户端节点必须具有相同的模块可加载,则无论如何都将Fun定义为服务器节点.那么为什么不只生成(Node,M,F,A),这清楚地表明你正在发送一个函数调用的定义,而不是Fun本身.

erlang distributed

4
推荐指数
1
解决办法
480
查看次数

Erlang VM在创建数百万个进程时被杀死

所以在Joe Armstrongs声称erlang进程很便宜并且vm可以处理数百万个之后.我决定在我的机器上测试它:

process_galore(N)->
    io:format("process limit: ~p~n", [erlang:system_info(process_limit)]),
    statistics(runtime),
    statistics(wall_clock),
    L = for(0, N, fun()-> spawn(fun() -> wait() end) end),
    {_, Rt} = statistics(runtime),
    {_, Wt} = statistics(wall_clock),
    lists:foreach(fun(Pid)-> Pid ! die end, L),
    io:format("Processes created: ~p~n
          Run time ms: ~p~n
          Wall time ms: ~p~n
          Average run time: ~p microseconds!~n", [N, Rt, Wt, (Rt/N)*1000]).

wait()->
    receive die ->
         done
    end.

for(N, N, _)->
    [];
for(I, N, Fun) when I < N ->
    [Fun()|for(I+1, N, Fun)].
Run Code Online (Sandbox Code Playgroud)

对于百万个流程来说,结果令人印象深刻 - 我得到6.6微米的aprox!秒平均产卵时间.但是当启动3m进程时,OS shell打印出的"Killed"与erlang运行时一样.我使用+ P 5000000标志运行erl,系统是:使用quadcore …

erlang process

3
推荐指数
1
解决办法
442
查看次数

clojure 应该是“代码就是数据”,但我无法添加到列表的末尾?

我在 grid.clj 文件中有一个矩阵的表示:

(-> (grid 10 10)
    (toggle 2 3 4 5)
    (off 2 3 4 5)
    (on 2 3 4 5))
Run Code Online (Sandbox Code Playgroud)

这是一个函数列表,第一个初始化一个网格,其他的修改它。
Clojures 的“代码即数据”应该可以让我通过在集合末尾添加一条指令来轻松修改该表示。列表是有序集合对吗?订单很重要。那么如何将指令添加到列表的末尾?
像这样的东西:

(def grid (read-string (slurp "grid.clj")))
(conj grid '(off 1 2 3 6))
Run Code Online (Sandbox Code Playgroud)

但是我不能添加到列表的末尾,这是一个可作为代码评估的数据结构。如果我不能添加到用于代码(作为数据)的有序集合的末尾,它如何“编码为数据”?

clojure

-6
推荐指数
1
解决办法
162
查看次数

标签 统计

erlang ×2

clojure ×1

distributed ×1

internals ×1

node.js ×1

process ×1