示例代码来解释我的问题。
寄件人
发送方,以格式将请求发送到服务器(通过 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 --
问题:
对我来说,这似乎是一个可能的线程问题(我可能是错的)。其中,传递给(服务器内部)赛璐珞(发送)的数据正在被其他线程更改。
我的印象是赛璐珞几乎可以处理您所有的线程问题。
我对这一切的理解正确吗?
您需要一个异步记录器。
每当你使用puts
你输出到一个缓冲区,与其他东西相比,它实际上非常慢。你应该做的,是使用一个纯粹在任何地方使用puts
的演员。
最好的办法是实例化一个受监督的Actor,比如名为:logger
,然后通过Celluloid[:logger].async.ouput()
在其他Actor内部与它进行交互,或者将output
转发到Celluloid[:logger].async
,以便每次使用output
或console
或类似的东西时,它都会触发asynchronous
方法调用。这样,即使你的演员正在做其他事情,控制台输出仍将是完美的顺序。
由于上述编程本身的异步问题,您的控制台输出正在被破坏,而不是Celluloid
......这是一个非常普遍的问题,有和没有ZeroMQ
.
是的,defer
正在破坏Receiver
输出的顺序,但不,这不是Celluloid
中的Thread
错误。这是异步操作的自然行为。在这种情况下,您需要删除defer {}
并保持async.received_data()
就像您拥有它一样。
否则,如您所见,Server
会用不按顺序排列的消息轰炸Receiver
。在所有这些之上直接管理线程也无济于事,而不是让Celluloid::ZMQ
为您做这件事。
另外:我会删除所有"外部"线程管理,并删除defer {}
包装器......并让Celluloid::ZMQ
顺利解决一切,并为您保持顺序。