Tag: multithreading

会话是否可以在Heroku上使用多个web dynos?

如果您在Heroku上运行带有多个Web dynos的Rails 3应用程序, 每次你点击应用程序,你通常会连接不同的网络动态? 会话可以在不同的网络动态中工作吗? 它适用于不同的Rails会话存储(ActionDispatch :: Session :: CookieStore,ActiveRecord :: SessionStore和ActionDispatch :: Session :: CacheStore)

每个RAILS_ENV运行多个delayed_job实例

我正在使用多RAILS_Env的Rails应用程序 env_name1: adapter: mysql username: root password: host: localhost database: db_name_1 env_name2: adapter: mysql username: root password: host: localhost database: db_name_2 … .. . 我正在使用delayed_job(2.0.5)插件来管理异步和背景工作。 我想为每个RAILS_ENV启动多个delayed_job: RAILS_ENV=env_name1 script/delayed_job start RAILS_ENV=env_name2 script/delayed_job start .. 我注意到我只能为第二个运行一个delayed_job实例,我有这个错误“错误:已经有一个或多个程序正在运行” 我的问题:每个RAILS_ENV都不可能运行多个delayed_job实例吗? 谢谢

Rails 4 Racing / Concurrency。 避免死锁

我目前在Sidekiq-Unique-Jobs和Sidekiq-Status的帮助下使用Sidekiq在我的应用程序上执行任务。 工人执行的工作很小,几乎总是立即执行。 (很少或根本没有队列) 我正在“黑客攻击”sidekiq同步执行任务(检查Controller无法找到工作人员创建的对象 ),这些作业很小且执行速度快(通常不到1秒)。 我的应用程序需要同步运行作业并获取其详细信息(记录创建/更新) 随着我使用的“跛脚”解决方案: 20.times do status = Sidekiq::Status::get balance, :exp_status if [“done”].include?(status) break end sleep(0.2) end 创建一个队列并确保通过params(sidekiq-unique-jobs)同一个用户同时执行不超过1个作业我可以避免所有死锁,但是我觉得它应该是一个更好的方法来执行此操作,而不是黑客sidekiq因为它意味着异步执行作业。 问题是 :对于sidekiq是否有任何替代或类似的gem可以限制输入但是默认情况下是同步运行的? 我不能只问控制器Balance.find_or_create_by(user: user, market: market)因为它迟早会给我死锁(记录被同时编辑/操纵/创建)但我觉得这个sidekiq解决方案我从长远来看,使用也不行。 我错过了一些基本的东西吗? 如何确保通过中间件或类似的东西不会同时执行重复的参数/动作以避免死锁?

ConnectionNotEstablished之后在JRuby中有一个multithreading环境

我有Rails(4.2.6)应用程序,我使用Thread(s)进行Rufus :: Scheduler引起的后台数据处理。 我在开发环境中有工作应用程序,但是当我在nginx +乘客上将它移动到生产时,我得到exceptionActiveRecord :: ConnectionNotEstablished ,即使没有足够的负载。 从Threads执行的ActiveRecord :: Base后代的所有调用都包含在内 ActiveRecord::Base.connection_pool.with_connection{} 我之前从未使用multithreading环境,但在对问题进行一些调查后,我建议可能就是这个问题。 在JRuby下尝试它是否合理,哪种包含是优先的? 主机系统是Ubuntu 14.04 x86_64。

访问rails线程中的变量

我正在构建一个基于网络的幻灯片放映的应用程序,其中一个“主”用户可以在幻灯片之间移动,每个人的浏览器都会跟随。 为此,我使用websockets和Redis作为全局通道来发送消息。 每个连接的客户端都有一个存储在数组中的信息@clients 。 然后我有一个单独的线程用于订阅Redis通道,其中定义了一个’on.message’块,它应该向@clients数组中的每个人发送一条消息,但该块在该块内是空的(在任何地方都不是空的)否则在模块中)。 几乎遵循这个例子: https : //devcenter.heroku.com/articles/ruby-websockets 相关代码,位于自定义中间件类中: require ‘faye/websocket’ require ‘redis’ class WsCommunication KEEPALIVE_TIME = 15 #seconds CHANNEL = ‘vip-deck’ def initialize(app) @app = app @clients = [] uri = URI.parse(ENV[‘REDISCLOUD_URL’]) Thread.new do redis_sub = Redis.new(host: uri.host, port: uri.port, password: uri.password) redis_sub.subscribe(CHANNEL) do |on| on.message do |channel, msg| puts @clients.count ### prints […]

ruby 2.1.2超时仍然不是线程安全吗?

我有50个sidekiq线程爬网,几周前线程在运行大约20分钟后开始挂起。 当我进行回溯转储时,大多数线程都停留在net / http初始化: /app/vendor/ruby-2.1.2/lib/ruby/2.1.0/net/http.rb:879:in `initialize’ /app/vendor/ruby-2.1.2/lib/ruby/2.1.0/net/http.rb:879:in `open’ /app/vendor/ruby-2.1.2/lib/ruby/2.1.0/net/http.rb:879:in `block in connect’ /app/vendor/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:76:in `timeout’ /app/vendor/ruby-2.1.2/lib/ruby/2.1.0/net/http.rb:878:in `connect’ /app/vendor/ruby-2.1.2/lib/ruby/2.1.0/net/http.rb:863:in `do_start’ /app/vendor/ruby-2.1.2/lib/ruby/2.1.0/net/http.rb:858:in `start’ /app/vendor/bundle/ruby/2.1.0/gems/net-http-persistent-2.9.4/lib/net/http/persistent.rb:700:in `start’ /app/vendor/bundle/ruby/2.1.0/gems/net-http-persistent-2.9.4/lib/net/http/persistent.rb:631:in `connection_for’ /app/vendor/bundle/ruby/2.1.0/gems/net-http-persistent-2.9.4/lib/net/http/persistent.rb:994:in `request’ /app/vendor/bundle/ruby/2.1.0/gems/mechanize-2.7.2/lib/mechanize/http/agent.rb:257:in `fetch’ /app/vendor/bundle/ruby/2.1.0/gems/mechanize-2.7.2/lib/mechanize/http/agent.rb:974:in `response_redirect’ /app/vendor/bundle/ruby/2.1.0/gems/mechanize-2.7.2/lib/mechanize/http/agent.rb:298:in `fetch’ /app/vendor/bundle/ruby/2.1.0/gems/mechanize-2.7.2/lib/mechanize.rb:432:in `get’ /app/app/workers/crawl_page.rb:24:in `block in perform’ /app/vendor/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:91:in `block in timeout’ /app/vendor/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:35:in `block in catch’ /app/vendor/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:35:in `catch’ /app/vendor/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:35:in `catch’ /app/vendor/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:106:in `timeout’ 我不认为sidekiq会卡在net / http上,因为我在超时中包装了整个调用: […]

如何在Rails启动时创建线程?

我正在尝试在Rails启动时创建一个线程,该线程将在应用程序的整个生命周期内运行。 奇怪的是,我已经使用了另一个我正在运行的线程。 我复制了那个(工作)代码并将其用作新线程新代码的样板。 但线程不会启动。 代码在config / initializers中(这是正确的位置吗?)。 文件以’z _…’开头命名,以确保它最后运行。 Rails 3.2.6 以下是代码的一般结构: class Blah def self.the_thread The_Model.transaction do # do some database stuff # … end TheThread = Thread.new do while true do the_thread sleep 5.seconds end end end 打开一个rails控制台并检查Blah :: TheThread会显示一个似乎没有运行的死线程。 在类的声明中,或者在方法中似乎没有任何错误,因为我可以在打开rails控制台时运行该方法并且它工作得很好。 另外,如果我手动输入rails控制台上面产生线程的确切代码(TheThread = Thread new do …),它就可以正常工作(每隔5秒唤醒一次,做它的事情,再次睡觉)。 同样,奇怪的是,在这个完全相同的应用程序中,这个用于在Rails中生成一个简单线程的精确模板曾经为我工作过。 如果有人对我认为是一个奇怪的问题有一些可能的见解,我会全力以赴。 谢谢。 编辑:新信息 – 我只是注释掉了事务调用(和匹配结束),它工作正常。 […]

更改密码后用户会话无效,但只有多个线程

我的Rails 4 + Devise 3.2应用程序中的一个function遇到了一个奇怪的问题,它允许用户通过AJAX POST将其密码更改为以下操作,该操作源自Devise wiki 允许用户编辑其密码 。 似乎在用户更改密码之后以及之后的一个或多个请求之后,它们将被强制注销,并在重新登录后继续被强制注销。 # POST /update_my_password def update_my_password @user = User.find(current_user.id) authorize! :update, @user ## CanCan check here as well if @user.valid_password?(params[:old_password]) @user.password = params[:new_password] @user.password_confirmation = params[:new_password_conf] if @user.save sign_in @user, :bypass => true head :no_content return end else render :json => { “error_code” => “Incorrect password” […]

在Middleware中运行的线程正在使用旧版本的父实例变量

我使用Heroku教程来实现websockets。 它适用于Thin,但不适用于Unicorn和Puma。 还有一个回应消息实现,它响应客户端的消息。 它在每个服务器上都能正常工作,因此websockets实现没有问题。 Redis设置也是正确的(它捕获所有消息,并执行subscribe块内的代码)。 它现在如何工作: 在服务器启动时,初始化一个空的@clients数组。 然后启动新的Thread,它正在侦听Redis,它旨在从@clients数组向相应的用户发送该消息。 在页面加载时,会创建新的websocket连接,它存储在@clients数组中。 如果我们从浏览器收到消息,我们会将其发送回与同一用户连接的所有客户端(该部分在Thin和Puma上都正常工作)。 如果我们收到Redis的消息,我们也会查找存储在@clients数组中的所有用户连接。 这是奇怪的事情发生的地方: 如果使用Thin运行,它会在@clients数组中找到连接并将消息发送给它们。 如果使用Puma / Unicorn运行,@ client数组总是为空,即使我们按该顺序尝试它(没有页面重新加载或任何东西): 从浏览器发送消息 – > @clients.length为1,传递消息 通过Redis发送消息 – > @clients.length为0,消息丢失 从浏览器发送消息 – > @clients.length仍为1,消息已发送 请问有人请告诉我我错过了什么? Puma服务器的相关配置: workers 1 threads_count = 1 threads threads_count, threads_count 相关中间件代码: require ‘faye/websocket’ class NotificationsBackend def initialize(app) @app = app @clients = [] Thread.new do redis_sub […]

如何确定在Heroku Performance dyno上运行的Puma工作者和线程的正确数量?

我已经阅读了Heroku关于Puma和dyno类型的所有文章,我无法得到直接答案。 我看到一些人提到Puma工人的数量应该由核心数决定。 我找不到Heroku揭示出性能-M或性能-L dyno有多少核心的地方。 在本文中,Heroku暗示了一种方法: https : //devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server 我认为他们建议将线程设置为1并增加Puma工作者的数量,直到你开始看到R14(内存)错误,然后退出。 然后增加线程数,直到CPU最大化,虽然我不认为Heroku报告CPU利用率。 有人可以提供指导吗? (我还想决定是否应该使用一个性能-L或多个性能-M dynos,但我认为一旦我弄清楚如何设置工作者和线程就会很清楚)