Tag: 异步

每个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 remote => true confusion(没有format.js?)

我正在尝试学习如何在窗体上使用带有remote => true的rails。 ruby on rails官方网站上的以下示例让我感到困惑。 即使在@user.save调用失败时没有“ format.js ”代码,它仍然可以正常工作。 # app/controllers/users_controller.rb # …… def create @user = User.new(params[:user]) respond_to do |format| if @user.save format.html { redirect_to @user, notice: ‘User was successfully created.’ } format.js format.json { render json: @user, status: :created, location: @user } else format.html { render action: “new” } format.json { render json: […]

在Sidekiq的民主队列

用户可以创建包含多个任务的Project对象。 当用户告诉项目execute所有这些任务都放在Sidekiq的默认队列中。 问题是:如果用户创建一个包含1000个任务的项目并点击execute按钮,那么所有这1000个任务都将被放入队列中。 如果在此之后,另一个用户创建只有一个任务的项目,当他点击执行该项目时,其唯一的任务就是放在行的末尾。 我希望这种背景过程能够以更民主的方式进行。 如果每个项目都有自己的队列,则很可能第一个项目中的一个任务在1000个任务队列结束之前执行。 为此,我将需要每个项目的separe队列,它应该动态创建。 我正在尝试使用以下代替perform_async来实现这一点: Sidekiq::Client.push(‘queue’ => “project_#{self.project.id}”, ‘class’ => TaskWorker, ‘args’ => [self.id]) 但是,当我尝试execute项目时,所有任务都放在一个名为“project_somenumber”的队列中,但它们都没有被执行。 看来当我使用Sidekiq::Client.push ,我需要告诉队列开始执行。 这是对的吗? 我怎么能开始那个队列?

Sidekiq Rails 4.2使用活动作业还是工作者? 有什么不同

这是我第一次异步处理作业我正在我的应用程序中实现Sidekiq进行后台处理。 我会用它来提醒电子邮件和应用内通知。 我很困惑我是否应该使用Active Job创建一个发送电子邮件或Sidekiq Worker来发送电子邮件的工作。 他们似乎做同样的事情,Rails 4.2 Active Job似乎很新……它是否取代了对Sidekiq工作者的需求? 以下是使用Active Job作业和Sidekiq Worker发送邮件代码的相同内容。 我正在使用Whenever gem进行调度。 my_mailers.rb class MyMailers < ActionMailer::Base def some_mailer(r.user_id) @user = User.find(r.user_id) mailer_name = "ROUNDUP" @email = @user.email @subject ="subject text" mail(to: @email, subject: @subject, template_path: '/notifer_mailers', template_name: 'hourly_roundup.html', ) end end 使用Sidekiq“工人” some_worker.rb class SomeWorker include Sidekiq::Worker def perform() @user = User.all […]

哈希标志后获取请求部分

我的网站采用AJAX驱动的搜索,使用深层链接。 当用户关注链接时…… http://example.com/articles#/?tags=Mac%20OS,review …标签“Mac OS”和“评论”应该已经在搜索表单中选择,并且应该在页面上显示与“Mac OS”和“评论”相关的文章。 我有以下情况,需要修复 用户可以访问http://example.com/articles#/?tags=Mac%20OS链接 在初始页面呈现期间,将获取所有文章 在客户端,解析散列部分,并且仅通过AJAX请求与“Mac OS”相关的文章。 客户端收到“Mac OS”文章并替换在步骤2中获取的所有文章。此外,它还在搜索表单上标记“Mac OS”标记。 这里的问题 – 重复的文章渲染,对用户来说看起来非常糟糕。 他查看了所有文章,几秒后,它们将被替换为“Mac OS” – 文章。 我需要有以下场景: 用户可以访问http://example.com/articles#/?tags=Mac%20OS链接 服务器解析散列部分并返回与“Mac OS”相关的文章 客户理解,“Mac OS” – 文章已经存在并且什么都不做。 它只是将“Mac OS”标记标记为已选中。 为此,我需要获取请求字符串的哈希部分: /?tags=Mac%20OS 我之后不能使用请求参数,因为我使用AJAX和深层链接。 使用?-part,浏览器将被强制重新加载页面。 我需要做任何事情而无需重新加载页面。 非常感谢您的帮助。 谢谢。

在Rails应用程序中运行异步作业的最佳方法是什么?

我知道有几个插件可以进行异步处理。 哪一个是最好的,为什么? 我所知道的是: BackgrounDRb

我们如何在Memcached读取上阻止Ruby on Rails,以免它占用CPU?

我们有一个守护进程,它扫描表中的脏位,然后批量调度脏行到delayed_job。 为了避免select from data where dirty = 1进行常量select from data where dirty = 1 ,我们设置了一个memcached屏障,它包装了表扫描,就像 loop do # daemon until Rails.cache.fetch(“have_dirty_rows”) do end page = 1 loop do # paginate dirty rows dirty_batch = paginate(#:select => “*”, :order => “id”, :per_page => DIRTY_GET_BATCH_SIZE, :conditions => {:dirty => 1}, :page => page) if dirty_batch.empty? Rails.cache.write(“have_dirty_rows”,false) break […]

使用ruby的异步HTTP请求

我有一个充满请求的rabbitmq队列,我想以异步方式将请求作为HTTP GET发送,而不需要等待每个请求响应。 现在我对什么是更好用,线程或只是EM感到困惑? 我现在使用它的方式类似于以下内容,但是很高兴知道这里是否有更好的性能以及更好的性能,因为它是该程序的一个非常重要的部分: AMQP.start(:host => “localhost”) do |connection| queue = MQ.queue(“some_queue”) queue.subscribe do |body| EventMachine::HttpRequest.new(‘http://localhost:9292/faye’).post :body => {:message => body.to_json } end end 使用上面的代码,系统是否会在开始下一个请求之前等待每个请求完成? 如果有任何提示,我会非常感激

最好使用EM.next_tick或EM.defer与Eventmachine进行长时间运行计算?

我试图弄清楚如何在我必须自己实现的长时间运行的计算中使用延迟。 对于我的例子,我想计算前200000个斐波纳契数,但只返回一个。 我对延期的第一次尝试看起来像这样: class FibA include EM::Deferrable def calc m, n fibs = [0,1] i = 0 do_work = proc{ puts “Deferred Thread: #{Thread.current}” if i < m fibs.push(fibs[-1] + fibs[-2]) i += 1 EM.next_tick &do_work else self.succeed fibs[n] end } EM.next_tick &do_work end end EM.run do puts "Main Thread: #{Thread.current}" puts "#{Time.now.to_i}\n" EM.add_periodic_timer(1) do […]

铁路定期任务

我在rails应用程序上有一个ruby,我试图找到一种方法来每隔几秒运行一些代码。 我发现了许多使用cron或类似cron的实现的信息和想法,但这些只是在一分钟内准确,和/或需要外部工具。 我想每15秒左右完成一次任务,我希望它完全自包含在应用程序中(如果应用程序停止,任务停止,没有外部设置)。 这用于缓存数据的后台生成。 每隔几秒钟,任务将汇总一些数据,然后将其存储在缓存中,该缓存将被所有客户端请求使用。 任务很慢,因此需要在后台运行而不是阻止客户端请求。 我对ruby很新,但是有一个强大的perl背景,我解决这个问题的方法就是创建一个间隔计时器和处理程序,它会分叉,运行代码,然后在完成后退出。 仅模拟客户端请求并让rails控制器自行分配可能更好。 这样我可以通过点击它来启动任务(虽然任务将每隔几秒运行一次,我怀疑我将需要,但可能有将来使用)。 虽然让控制器调用周期性任务调度程序调用的任何方法(一旦我有一个),这将是微不足道的。