1

示例代码来解释我的问题。

发件人

发送方,将请求以格式发送到服务器(通过 ZMQ)

 ["sender-1", "sender-1-bdc1c14624076b691b8d9e15fbd754f1"]

 ..
 ["sender-99","sender-99-a2123d02c2989ef57da370bb13ba60e4"]

服务器

服务器在接收到来自发送方的数据后,以相同的格式将其转发回接收方。

  ["sender-1", "sender-1-bdc1c14624076b691b8d9e15fbd754f1"]

  ...
  ["sender-99","sender-99-a2123d02c2989ef57da370bb13ba60e4"]

接收者

接收者在收到来自服务器的请求后,只打印消息。

描述:

如果我不使用这一mutex中定义的(在服务器内部)。我看到接收端出现了一些不符合上述格式/标准的数据。

服务器将打印的示例(在此

"Sending sender-97 -- sender-97-9a284488454c8e8fd22bbbcf678895e9"

"Sending sender-98 -- sender-98-447eb5be94e7f6d949e764d7c88239ad"

但是在接收端,我看到的消息看起来像这样。

sender-97 -- sender-98   
sender-98-22d9f01a8f801f559a9ff4e388813251 --  

问题:

对我来说,这似乎是一个可能的线程问题(我可能错了)。其中传递给(服务器内部)赛璐珞(发送)的数据正在被其他线程更改。

我的印象是赛璐珞可以处理几乎所有的线程问题。

我对这一切的理解是否正确?

4

1 回答 1

0

您需要一个异步记录器。

每当您使用puts时,您都会输出到一个与其他东西相比实际上非常慢的缓冲区。你应该做的,是使用一个纯粹用于puts无处不在的演员。

最好的办法是实例化一个受监督的actor,比如命名:logger,然后在你的其他actor内部与它进行交互,Celluloid[:logger].async.ouput()或者转发outputCelluloid[:logger].async,这样每次你使用outputconsole类似的东西时,它都会触发一个asynchronous方法调用。这样,即使您的演员正在做其他事情,控制台输出仍将保持完美的顺序。

由于上述编程本身的异步问题,您的控制台输出被破坏了,而不是Celluloid......这是一个非常常见的问题,无论有没有ZeroMQ.


defer的会破坏您的输出顺序,Receiver但不,这不是Thread. Celluloid这是异步操作的自然行为。在这种情况下,您需要删除defer {}并保持async.received_data()原样。

否则,如您所见,将用乱序的消息Server轰炸。Receiver您在所有这些之上直接管理线程,而不是让Celluloid::ZMQ您为您做这件事,这也无济于事。

另外:我会删除所有“外部”线程管理,并删除defer {}包装器......让Celluloid::ZMQ一切顺利,并为您保持顺序。

于 2016-03-04T20:18:37.650 回答