我有一组工作者MessageConsumer
,每个人都有不同的职责:HTTP调用、CRUD Mongo/Redis、API调用等
它们具有相同的结构:
class MessageConsumer
include Celluloid
def perform(sqs_message)
# Do something
end
end
我为每个worker创建了一个[worker-name].rb
文件,内容如下:
Celluloid::Actor[:pool] = MessageConsumer.pool
while @still_running
sqs_message = @queue.receive_message(start_options)
if sqs_message
Celluloid::Actor[:pool].async.perform(sqs_message)
else
# sleep for a while as there's nothing in the queue.
sleep rand(2..6)
end
end
@queue.receive_message
从Amazon SQS接收消息,并调用worker传递消息。
在每个服务器上,我们有一组[worker-name].rb
运行:
pgrep -fl ruby
14885 ruby bin/worker_http # two processes
15890 ruby bin/worker_http # ^^^
17956 ruby bin/worker_api
19734 ruby bin/worker_mongo
22637 ruby bin/worker_redis
问题:在运行进程一段时间后(在线程忙碌之后),我经常得到"No live threads left. Deadlock?"
。
我在服务器中使用ruby 2.0.0p451 (2014-02-24 revision 45167) [x86_64-linux]
,不确定这是否是与MRI相关的问题,也许我需要切换到JRuby。但有趣的是,我不认为这个问题很常见,所以我认为这可能是我的实现的问题。
有什么想法吗
2条答案
按热度按时间pqwbnv8z1#
添加加入限制似乎可以解决这个问题:
尝试在lib/celluloid/actor.rb中增加它:
xytpbqjk2#
这不是这个问题的最终答案,但可能有助于其他人来这里,了解他们的问题。
只需将
Thread.new { sleep }
添加到您的源代码。这并不能解决问题!
它只是帮助-有时-得到错误消息后,'坏事情'发生。
因为“Deadlock?”只是一个建议,在很多情况下它是一个“Dead end”,所以后面有错误,指向真实的的原因,你看不到,因为Ruby采取了紧急跳闸线。
如果- useless -
Thread
还活着,Ruby就不会这么快退出。**再次声明:**这不是解决方案,只是一个调试帮助。