[英]Concurrency in JRuby
我正在研究Sinatra-JRuby应用程序并处理并发API调用进入API层然后由服务和适配器层处理的情况。 我正在使用GlobalService模块来共享公共信息,以便我可以从任何其他层访问此公共信息。 这可以正常工作,直到并发调用到来并重置以前的API的值。 虽然我已经实现了Mutex来解决这个问题,但我有一种直觉,认为这不是解决问题的正确方法。 这是我实施的内容:
require 'thread'
module GlobalService
@@mutex = Mutex.new
def self.set_header(auth_subject, transaction_id)
@@mutex.synchronize {
@auth_subject = auth_subject
@transaction_id = transaction_id
}
end
def self.get_header
@@mutex.synchronize {
return @auth_subject, @transaction_id
}
end
end
请让我知道解决此问题的任何替代解决方案。
共享内存永远不会真正是线程安全的,所以你可能会使用消息传递策略。 我对此的偏好是创建演员并让他们就状态变化进行沟通。 查看Concurrent Ruby的演员http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Actor.html 。
你可以做点什么
require 'concurrent'
class GlobalService < Concurrent::Actor::Context
def initialize(auth_subject, transaction_id)
@auth_subject = auth_subject
@transaction_id = transaction_id
end
def on_message(message)
#some logic
@auth_subject = message.auth_subject
@transaction_id = message.transaction_id
end
end
service = GlobalService.spawn(:first,“header ...”,id)等...
我过去曾经使用过这种策略,而且效果相当好。 您可能还想在https://gitter.im/ruby-concurrency/concurrent-ruby上寻求帮助.Pitrch通常非常有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.