C#中的OOP概念"消息传递"的例子是什么(调用方法/传递参数/触发事件/处理事件/ ???)以及为什么称为消息传递?
我在一个数据处理应用程序上工作,通过在消息驱动bean(MDB)的多个实例监听的消息队列上放置几个工作单元来实现并发.除了以这种方式实现并发之外,我们没有任何具体的理由使用消息传递基础结构和MDB.
这让我想到为什么使用多线程无法实现同样的目标.
所以我的问题是,在什么情况下,异步消息传递(例如JMS)可以用作替代mutithreading作为实现并发的手段?使用一种方法比另一种方法有什么优点/缺点.
我最初在这里问过这个问题,但我意识到我的问题不是关于一个真正的循环.我想知道的是,在Java中进行高性能异步消息传递的正确方法是什么?
我想做什么......
我有大约10,000名消费者,每个消费者都从他们的私人队列中消费消息.我有一个线程一个接一个地生成消息并将它们放在正确的消费者队列中.每个消费者无限循环,检查消息是否出现在队列中并进行处理.
我认为这个术语是"单一生产者/单一消费者",因为有一个生产者,每个消费者只能在他们的私人队列上工作(多个消费者从不从同一个队列中读取).
在Consumer.java里面:
@Override
public void run() {
while (true) {
Message msg = messageQueue.poll();
if (msg != null) {
... // do something with the message
}
}
}
Run Code Online (Sandbox Code Playgroud)
Producer正在快速地将消息放入消费者消息队列中(每秒数百万条消息).消费者应该尽快处理这些消息!
注意:while (true) { ... }由Producer作为最后一条消息发送的KILL消息终止.
但是,我的问题是关于设计此消息传递的正确方法.我应该为messageQueue使用什么样的队列?应该是同步还是异步?如何设计消息?我应该使用while-true循环吗?消费者应该是一个线程,还是其他什么?10,000个线程会慢慢爬行吗?什么是线程的替代品?
那么,在Java中进行高性能消息传递的正确方法是什么?
对于Node.Js和Erlang,我都是一个完整的菜鸟.但是不可能构建一个模拟Erlang行为的Node.js应用程序吗?
例如,您将json消息传递到分布式node.js服务器园区,甚至将新代码传递给那些没有脱机的服务器,就像erlang一样.
如果您有一个在收到消息时激活的消息处理程序回调,则此消息处理程序可以检查该消息是否是代码更新消息,从而用新代码替换自身(当前处理程序).
所以应该可以让Node.Js服务器没有停机时间来进行代码更新,而不是太大惊小怪,对吧?
关于MPI_Isend,MPI标准说"非阻塞发送调用表明系统可能开始从发送缓冲区中复制数据.在调用非阻塞发送操作之后,发送方不应访问发送缓冲区的任何部分,直到发送完成. " (http://www.mpi-forum.org/docs/mpi-11-html/node46.html)
是在另一个发送调用ok中引用发送缓冲区,还是包含在"访问发送缓冲区的任何部分"中?
换句话说,发件人的以下C代码是否正确?
MPI_Request req[2];
MPI_Status statuses[2];
...
MPI_Isend(buf, type, count, dest0, tag, comm, &req[0]);
MPI_Isend(buf, type, count, dest1, tag, comm, &req[1]);
MPI_Waitall(2, req, statuses);
Run Code Online (Sandbox Code Playgroud) 我正在编写一个用于编排AWS集群的小框架,并且有一些常见的层次结构模式一次又一次出现.一种这样的模式是将一组实例收集到一个更大的对象中,然后将一些方法直接委托给所有实例.因此,我不是一遍又一遍地复制和粘贴相同的样板代码,而是使用以下模式对其进行抽象:
def __getattr__(self, item):
if not item in self._allowed_items:
raise NonDelegatableItem
def delegator():
for instance in self.all_instances:
getattr(instance, item)()
return delegator
Run Code Online (Sandbox Code Playgroud)
是否有更好的方式或模式来完成授权?
我有一个覆盖overlay.xul覆盖的文件browser.xul.我想以与chrome扩展中实现的类似方式实现消息传递.
chrome.manifest-
content helloworld content/
overlay chrome://browser/content/browser.xul chrome://helloworld/content/overlay.xul
overlay chrome://navigator/content/navigator.xul chrome://helloworld/content/overlay.xul
skin helloworld classic/1.0 skin/
style chrome://global/content/customizeToolbar.xul chrome://helloworld/content/overlay.css
Run Code Online (Sandbox Code Playgroud)
如何content_script.js在我的情况下注册哪个overlay.js?
Overlay.xul -
<script type="application/x-javascript" src="chrome://helloworld/content/jquery.js" />
<script type="application/x-javascript" src="chrome://helloworld/content/overlay.js" />
<script type="application/x-javascript" src="chrome://helloworld/content/background.js" />
Run Code Online (Sandbox Code Playgroud)
现在overlay.js我正在使用 -
document.documentElement.addEventListener('click', function(e) {
messageManager.sendAsyncMessage('MyMessenger.MyMessage', {});
}, true);
Run Code Online (Sandbox Code Playgroud)
而且是background.js-
addMessageListener("MyMessenger.MyMessage", function(obj) {
Firebug.Console.log(obj.name);
}, true);
Run Code Online (Sandbox Code Playgroud)
鉴于以下情况:
BufferBlock<int> sourceBlock = new BufferBlock<int>();
TransformBlock<int, int> targetBlock = new TransformBlock<int, int>(element =>
{
return element * 2;
});
sourceBlock.LinkTo(targetBlock, new DataflowLinkOptions { PropagateCompletion = true });
//feed some elements into the buffer block
for(int i = 1; i <= 1000000; i++)
{
sourceBlock.SendAsync(i);
}
sourceBlock.Complete();
targetBlock.Completion.ContinueWith(_ =>
{
//notify completion of the target block
});
Run Code Online (Sandbox Code Playgroud)
在targetBlock似乎永远不会完成,我想原因是,在所有的项目TransformBlock targetBlock在输出队列中等待,因为我还没有链接的targetBlock其他任何数据流块。但是,我真正想要实现的是当(A)targetBlock通知完成和(B)输入队列为空时的通知。我不想关心项目是否仍然位于TransformBlock. 我该怎么办?是让我想查询的完成状态什么的唯一方式sourceBlock,并确保了InputCount的targetBlock是零?我不确定这是否非常稳定(sourceBlock如果中的最后一项sourceBlock已传递给 …
c# concurrency message-passing task-parallel-library tpl-dataflow
我知道您可以使用以下内容执行简单的消息传递:
self() ! hello.
Run Code Online (Sandbox Code Playgroud)
您可以通过调用查看消息:
冲洗()。
我还可以在函数中创建简单的进程,例如:
spawn(module, function, args).
Run Code Online (Sandbox Code Playgroud)
但是我不清楚如何在不注册 Pid 的情况下向进程发送消息。
我已经看到一些示例,表明您可以在 shell 中对它进行模式匹配以获取分配给 var 的 Pid,因此如果我创建一个 gen_server,例如:
...
start_link() ->
gen_server:start_link(?MODULE, init, []).
init(Pid) ->
{ok, Pid}.
...
Run Code Online (Sandbox Code Playgroud)
然后我可以在 shell 中使用以下命令调用它:
{ok, Pid} = test_sup:start_link().
{ok,<0.143.0>}
> Pid ! test.
test
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,您能否以 <0.0.0> 的形式向 Pids 发送消息,而无需将它们注册到 shell 中的原子或变量?实验和搜索被证明是徒劳的......
让我们想象一下,我在elixir中产生了多个子进程.
defmodule Child do
def start(name) do
receive do
msg -> IO.puts "Message received by #{name}: #{inspect msg}"
end
end
end
defmodule Parent do
def main do
child1 = spawn_link (fn -> Child.start("1") end)
child2 = spawn_link (fn -> Child.start("2") end)
child3 = spawn_link (fn -> Child.start("3") end)
end
end
Run Code Online (Sandbox Code Playgroud)
反正我是否可以向当前流程(或其他流程)的所有孩子发送消息?
send_to_children self(), "hello to all children"
Run Code Online (Sandbox Code Playgroud)
在某种程度上,我可以告诉运行时将消息广播到链接到当前进程的所有进程?我当然可以将所有生成的pid存储在某种数据结构中并循环遍历它,但是如果有某种规范方法可以做到这一点,那么它似乎会更高效,更不容易出错.
message-passing ×10
erlang ×3
c# ×2
java ×2
asynchronous ×1
concurrency ×1
delegation ×1
elixir ×1
firefox ×1
jboss-mdb ×1
jms ×1
mpi ×1
node.js ×1
oop ×1
process ×1
python ×1
python-2.7 ×1
reflection ×1
robustness ×1
tpl-dataflow ×1