我注意到“消息传递”有两种方法。一个是我见过的Erlang使用的,另一个来自Stackless Python。据我所知,这就是区别
Erlang样式-消息被发送并排队到接收进程的邮箱中。从那里他们被删除在先进先出的基础上。一旦第一个进程发送消息,它就可以继续运行了。在
Python风格-进程A排队等待发送到进程B。B当前正在执行其他操作,因此A被冻结,直到B准备好接收为止。一旦B打开一个读通道,a发送数据,然后它们都继续。在
现在我看到Erlang方法的优点是没有任何阻塞的进程。如果B永远无法接收,A仍然可以继续。然而,我注意到在我编写的一些程序中,由于消息的流入量大于流出量,Erlang消息框可能会充满数百(或数千)条消息。在
现在我还没有用任何一种框架/语言编写过一个大型程序,所以我想知道你在这方面的经验,如果这是我应该担心的事情。在
是的,我知道这是抽象的,但我也在寻找相当抽象的答案。在
我在Erlang编程方面的经验是,当您期望较高的消息传递速率(即,生产者比消费者更快)时,您就添加了自己的流控制。一个简单的场景
也可以反转它,生产者等待消费者来获取下一个可用的N条消息。在
这些方法和其他流控制可以隐藏在函数后面,第一种方法在
gen_server:call/2,3
中针对gen_server
OTP行为过程已经可用。在我认为Erlang中的异步消息传递是更好的方法,因为当延迟很高时,您可能非常希望避免在计算机之间进行消息传递时发生同步。然后就可以组合出实现流控制的巧妙方法。例如,要求消费者对生产者发送的每N条消息进行确认,或者时不时地发送一条特殊的“当你收到这条消息时ping我”消息,以计算ping时间。在
广义地说,这是无界队列与有界队列。无堆栈通道可以看作是0大小队列的一种特殊情况。在
有界队列有死锁的倾向。两个线程/进程试图互相发送消息,两个线程/进程都有一个完整的队列。在
无限队列有更微妙的失败。如您所述,大型邮箱无法满足延迟要求。走得足够远,它最终会溢出;没有无限内存这回事,所以它实际上只是一个有界队列,它有一个巨大的限制,当它满的时候会中止进程。在
哪个最好?这很难说。这里没有简单的答案。在
相关问题 更多 >
编程相关推荐