我一直在阅读文档,试图了解何时通过+ AN开关增加异步线程池大小是有意义的.
我完全准备好进行基准测试,但我想知道是否有一个经验法则,当一个人应该怀疑将池大小从0增加到N(或N到N + M)会有所帮助.
谢谢
问题在于分布式应用程序协商的一部分是当节点握手以确定哪个节点将保持停顿以及哪个节点将被停顿时,应用程序将在所有节点处启动.如果可能的话,我需要应用程序不要在多个节点上运行.
我希望我如何开始讨论我的问题
拿一个包含26个键的表,az并让它们具有整数值.创建一个过程,哎呀,一遍又一遍地做两件事
如果你甚至旋转了一些这些过程,你会很快看到a,b和c处于其值不总和为10的状态.我相信没有办法让mnesia"锁定这3条记录在开始写入(或读取)之前,人们只能让记录锁定记录(可以这么说),这允许记录集的值违反我的"必须总和到10"的约束.
如果我是对的,这个问题的解决方案包括
想法?
好吧,我是一个雄心勃勃的Erlang newbee,很抱歉,如果这是一个愚蠢的问题,但是
我正在构建一个特定于应用程序的内存分布式缓存,我需要能够在一个事务中编写Key,Value对的集合,并在一个事务中检索值集.换句话说,我需要1)将40个键值对写入缓存,并确保在这个多键写操作期间没有其他人可以读取或写入这40个键中的任何一个; 并且,2)在一次操作中读取40个键并获得40个值,知道从该读取操作开始到结束的所有40个值都没有改变.
我能想到这样做的唯一方法是将整个表锁定在fetch_keylist([ListOfKeys])的开头或write_keylist的开头([KeyValuePairs],但我不想这样做,因为我有许多进程同时执行自己的multi_key读取和写入,并且我不想在任何进程需要读取/写入相对较小的记录子集时锁定整个表.
救命?
试图更清楚:我不认为这只是关于使用香草交易
我想我要问一个比这更微妙的问题.想象一下,我有一个进程,在一个事务中,迭代10个记录,锁定它们.现在假设这个过程开始但在它迭代到第3个记录之前另一个过程更新了第3个记录.就事务而言,这将是正常的,因为第一个进程尚未锁定第三个记录(尚未),而OTHER进程修改它并在第一个进程到达之前将其释放.我想要的是保证,一旦我的第一个进程启动 ,没有其他进程可以触及10个记录,直到第一个进程完成它们.
问题解决了 - 我是个傻瓜......我猜...谢谢你的病人,特别是Hynek -Pichi- Vychodil!我准备我的测试代码显示的问题,我可以在事实上重现该问题.然后我简化了代码的可读性,问题就消失了.我无法再次重现这个问题.这对我来说既尴尬又神秘,因为我有几天这个问题.mnesia也从不抱怨我在事务之外执行操作而且我的代码中没有任何脏事务,我不知道我是如何将这个bug引入我的代码的!
我把隔离的概念砸到脑海里,不会再怀疑它是否存在.
谢谢你的教育.
实际上,事实证明问题是在事务中使用try/catch围绕mnesia操作.请看这里了解更多.
我仍在尝试深入了解 Mnesia 可以做什么,这两个问题的答案将会有很大帮助。
1) 如果一个进程对记录 X 执行原子事务,而其他进程执行涉及同一记录的脏事务,会发生什么情况。第一个进程的 ACID 属性是否受到损害?
2)有没有办法让同一个进程在一个表的行上持有非脏(mnesia:transaction / 1)读锁,同时对另一个表进行脏操作?
我有两台使用内部IP地址的虚拟机互相通话,而外界只通过外部IP地址了解这些虚拟机.
我有一个使用两个VM的分布式缓存 - 每个都有一个必须与另一个进行通信的Erlang节点.我还有其他机器上的现金的Erlang客户端需要与VM上的一个(或两个)Erlang缓存节点进行通信.
因此,如果我使用内部IP地址命名的缓存节点,那么它们可以相互通信,但没有其他Erlang节点可以与它们交互.但是,如果我使用VM的外部IP地址命名缓存节点,那么外部Erlang节点可以与缓存节点通信,但缓存节点不能彼此通信.
除了使用不依赖于将节点连接到网格中的基于http或套接字的接口之外,我能做些什么吗?
在Cowboy github上提供的示例中,以及我在网上找到的一些其他示例中,有一对一的主管似乎什么也没做.我甚至认为我看到了一个有以下评论的例子,"就像真正的主管不做任何事情一样".
监督模块的目的似乎是如此众多的牛仔示例的一部分?
从echo_get示例:
%% Feel free to use, reuse and abuse the code in this file.
%% @private-module(echo_get_sup).
-behaviour(supervisor).
%% API.
-export([start_link/0]).
%% supervisor.
-export([init/1]).
%% API.
-spec start_link() -> {ok, pid()}.
start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
%% supervisor.
init([]) ->
Procs = [],
{ok, {{one_for_one, 10, 10}, Procs}}.
Run Code Online (Sandbox Code Playgroud) 在传递给 mnesia:async_dirty() 的函数中执行的一系列 mnesia:dirty_ 命令与那些“原始”执行的完全相同的事务之间有什么区别?
即,这样做有什么区别:
mnesia:dirty_write({table, Rec1}),
mnesia:dirty_write({table, Rec1}),
mnesia:dirty_write({table, Rec1})
Run Code Online (Sandbox Code Playgroud)
和
F = fun() ->
mnesia:dirty_write({table, Rec1}),
mnesia:dirty_write({table, Rec1}),
mnesia:dirty_write({table, Rec1})
end,
mnesia:async_dirty(F)
Run Code Online (Sandbox Code Playgroud)
谢谢
我有一个数据表,当没有记录时,有时应该说"点击上面的项目",其他时候应该说"表格中没有数据".
表初始化后我无法更改sZeroRecords字符串.
任何人都可以建议一种方法来做到这一点 - 或其他一些技术来获得相同的行为?
谢谢,
我有 5 个进程在 mnesia 表中插入/更新相同的 3 条记录。这些进程中的每一个都在单个事务中执行其插入/更新。
我还有 5 个其他进程读取这些相同的 3 条记录,也在一个事务中。
除非我将整个表锁定为多记录事务的一部分,否则我会收到 {aborted, {cyclic, node....}} 错误。我的直觉是,我的用例是普通的,其本身不应该导致事务中止。有人可以帮助我解决我愚蠢的想法吗?我所做的只是在一个事务中的缓存(mnesia 表)中插入(或读取)多行。
插入 3 条记录如下所示
insert_keylist(Keys) ->
F = fun() -> insert_iter(Keys) end,
transactional_execute(F).
insert_iter([]) ->
ok;
insert_iter([{Key, Value} | KVs]) ->
insert(Key, Value),
insert_iter(Kvs).
insert(Key, Value) ->
F =
fun() ->
case sc_store:lookup(Key) of
{ok, _Value} -> sc_store:replace(Key, Value);
{error, not_found} -> sc_store:insert(Key,Value)
end
end,
transactional_execute(F).
transactional_execute(F) ->
case mnesia:is_transaction() of
true -> F();
false ->
try mnesia:sync_transaction(F) of
{atomic, Result} -> Result; …Run Code Online (Sandbox Code Playgroud) 因此,我在一次交易中对记录集进行CRUD操作时遇到各种麻烦。它导致我在此处发布2个问题,Trouble和MoreTrouble。但是,我认为这两个问题都是由以下原因造成的:在我的事务中,我将mnesia:writes,reads等包含在try / catch块中,该块捕获了包括mnesia异常中止的事务在内的所有内容,并将其作为避免死锁的算法的一部分。即
insert(Key, Value) ->
F =
fun() ->
case sc_store:lookup(Key) of
{ok, _Value} -> sc_store:replace(Key, Value);
{error, not_found} -> sc_store:insert(Key,Value)
end
end,
try
case mnesia:transaction(F) of
{atomic, Result} -> Result;
{aborted, Reason} -> ...
end
catch
Error:Reason -> ...
end
Run Code Online (Sandbox Code Playgroud)
结束
例如,sc:lookup / 1看起来像这样:
lookup(Key) ->
try
case mnesia:read(key_to_value, Key) of
[#key_to_value{type = Type, scope = Scope, value = Value}] ->
{ok, {Value, Type, Scope}};
[] ->
{error, not_found}
end …Run Code Online (Sandbox Code Playgroud)