使用赛璐珞ZMQ推迟导致数据问题

时间:2016-03-04 16:17:05

标签: ruby multithreading celluloid

示例代码解释我的问题。

Sender

发件人,以格式

将请求发送到服务器(通过ZMQ)
 ["sender-1", "sender-1-bdc1c14624076b691b8d9e15fbd754f1"]

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

Server

服务器收到发件人的数据后,会以相同的格式将其转发回接收者。

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

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

Receiver

接收方收到服务器的请求后,只会打印消息。

说明

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

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

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

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

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

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

问题:

对我而言,这似乎是一个可能的线程问题(我可能是错的)。其中传递给(服务器内部)Celluloid(send)的数据正在被其他线程更改。

我的印象是Celluloid几乎处理了所有线程问题。

我的理解是否正确?

1 个答案:

答案 0 :(得分:0)

您需要一个异步记录器。

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

最好的方法是实例化一个受监督的演员,比如名为:logger,然后通过Celluloid[:logger].async.ouput()或其他演员在output内与Celluloid[:logger].async进行互动。output因此,每次使用consoleasynchronous或类似内容时,都会触发Celluloid方法调用。这样,即使你的演员正在进行其他工作,控制台输出仍将是完美的顺序。

您的控制台输出因为上述编程本身的异步问题而受到严重影响,而不是ZeroMQ ...这是一个非常常见的问题,无论是否有defer

Receiver正在中断Thread输出的顺序,但Celluloid中的defer {}错误不是。{1}}。这是异步操作的自然行为。在这种情况下,您需要删除async.received_data()并保留Server,就像拥有它一样。

否则,正如您所见,Receiver将不按顺序轰炸Celluloid::ZMQ。除了让defer {}为你做这件事之外,你直接管理线程也没有帮助。

另外:我会删除所有“外部”线程管理,并删除Celluloid::ZMQ包装器...并让Generate Flow File > Fetch File -> Extract Text (here the value for the WHERE clause is exposed as a property "property1")> ExecuteSQL (Oracle DB) -> PutFile (results of the query) 将所有内容平滑,并为您保留序列