阻塞通道与异步消息传递

2024-10-16 17:20:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我注意到“消息传递”有两种方法。一个是我见过的Erlang使用的,另一个来自Stackless Python。据我所知,这就是区别

Erlang样式-消息被发送并排队到接收进程的邮箱中。从那里他们被删除在先进先出的基础上。一旦第一个进程发送消息,它就可以继续运行了。在

Python风格-进程A排队等待发送到进程B。B当前正在执行其他操作,因此A被冻结,直到B准备好接收为止。一旦B打开一个读通道,a发送数据,然后它们都继续。在

现在我看到Erlang方法的优点是没有任何阻塞的进程。如果B永远无法接收,A仍然可以继续。然而,我注意到在我编写的一些程序中,由于消息的流入量大于流出量,Erlang消息框可能会充满数百(或数千)条消息。在

现在我还没有用任何一种框架/语言编写过一个大型程序,所以我想知道你在这方面的经验,如果这是我应该担心的事情。在

是的,我知道这是抽象的,但我也在寻找相当抽象的答案。在


Tags: 方法程序消息进程风格样式基础发送数据
2条回答

我在Erlang编程方面的经验是,当您期望较高的消息传递速率(即,生产者比消费者更快)时,您就添加了自己的流控制。一个简单的场景

  • 消费者将:发送消息,等待确认,然后重复。在
  • 生产者将:等待消息,在消息接收和处理时发送ack,然后重复。在

也可以反转它,生产者等待消费者来获取下一个可用的N条消息。在

这些方法和其他流控制可以隐藏在函数后面,第一种方法在gen_server:call/2,3中针对gen_serverOTP行为过程已经可用。在

我认为Erlang中的异步消息传递是更好的方法,因为当延迟很高时,您可能非常希望避免在计算机之间进行消息传递时发生同步。然后就可以组合出实现流控制的巧妙方法。例如,要求消费者对生产者发送的每N条消息进行确认,或者时不时地发送一条特殊的“当你收到这条消息时ping我”消息,以计算ping时间。在

广义地说,这是无界队列与有界队列。无堆栈通道可以看作是0大小队列的一种特殊情况。在

有界队列有死锁的倾向。两个线程/进程试图互相发送消息,两个线程/进程都有一个完整的队列。在

无限队列有更微妙的失败。如您所述,大型邮箱无法满足延迟要求。走得足够远,它最终会溢出;没有无限内存这回事,所以它实际上只是一个有界队列,它有一个巨大的限制,当它满的时候会中止进程。在

哪个最好?这很难说。这里没有简单的答案。在

相关问题 更多 >