我正在尝试在我的rails应用程序中使用新的Sidekiq gem,但是当我运行时,sidekiq
我得到:
Booting sidekiq 0.5.1 with Redis at redis://localhost:6379/0
/Users/Kyle/.rvm/gems/ruby-1.9.2-p290@skateparks/gems/celluloid-0.8.0/lib/celluloid/task.rb:56: [BUG] Bus Error
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin11.2.0]
-- control frame ----------
c:0010 p:---- s:0034 b:0034 l:000033 d:000033 CFUNC :resume
c:0009 p:0018 s:0030 b:0030 l:000029 d:000029 METHOD /Users/Kyle/.rvm/gems/ruby-1.9.2-p290@skateparks/gems/celluloid-0.8.0/lib/celluloid/task.rb:56
c:0008 p:0081 s:0025 b:0025 l:000c40 d:000c40 METHOD /Users/Kyle/.rvm/gems/ruby-1.9.2-p290@skateparks/gems/celluloid-0.8.0/lib/celluloid/actor.rb:181
c:0007 p:0052 s:0021 b:0021 l:000020 d:000020 METHOD /Users/Kyle/.rvm/gems/ruby-1.9.2-p290@skateparks/gems/celluloid-0.8.0/lib/celluloid/actor.rb:130
c:0006 p:0061 s:0015 b:0015 l:001db0 d:000014 BLOCK /Users/Kyle/.rvm/gems/ruby-1.9.2-p290@skateparks/gems/celluloid-0.8.0/lib/celluloid/actor.rb:89
c:0005 p:---- s:0013 b:0013 l:000012 d:000012 FINISH
c:0004 p:---- s:0011 b:0011 l:000010 d:000010 CFUNC …
Run Code Online (Sandbox Code Playgroud) 我写了一个工人:
class XmlParseWorker
include Sidekiq::Worker
sidekiq_options queue: "parsing"
def perform
........
end
end
Run Code Online (Sandbox Code Playgroud)
当我尝试在控制台中运行它时:
XmlParseWorker.perform_asynch()
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
NoMethodError: undefined method `perform_asynch' for XmlParseWorker:Class
Run Code Online (Sandbox Code Playgroud)
我已将sidekiq添加到我的gemfile中:
gem 'sidekiq'
gem 'sinatra' , require: false
gem 'slim'
Run Code Online (Sandbox Code Playgroud)
并运行捆绑安装.
我跑了redis:
redis-server
Run Code Online (Sandbox Code Playgroud)
和sidekiq队列:
bundle exec sidekiq -q parsing
Run Code Online (Sandbox Code Playgroud)
但我甚至没有在sideqik网站管理员中看到它.
有任何想法吗?
我正在将一个rails3应用程序从heroku转移到引擎码.我想知道如何在每个部署的引擎码上启动(或重新启动)sidekiq?要检查sidekiq是否正常工作,我ssh到EY实例并手动启动sidekiq.我希望从EY部署脚本(config/deploy.yml)处理此过程.我习惯于mina部署和EC2.
我正在使用 Sidekiq 在后台执行一些繁重的处理。我在网上查了一下,但找不到以下问题的答案。我在用:
Class.delay.use_method(listing_id)
Run Code Online (Sandbox Code Playgroud)
然后,在课堂上,我有一个
self.use_method(listing_id)
listing = Listing.find_by_id listing_id
UserMailer.send_mail(listing)
Class.call_example_function()
Run Code Online (Sandbox Code Playgroud)
两个问题:
如何使这个函数对 UserMailer sendmail 是幂等的?换句话说,如果延迟方法运行两次,我如何确保它只发送一次邮件?会把它包装成这样的工作吗?
mail_sent = false if !mail_sent UserMailer.send_mail(listing) mail_sent = true end
我猜不是,因为再次尝试该函数,然后第二次运行时将 mail_sent 设置为 false。那么如何才能让 UserMailer 只运行一次。
总的来说,只是熟悉 Sidekiq,所以任何想法都将不胜感激。
谢谢
我正在为控制器操作构建一个worker,但是由于我在perform
方法中调用params,sidekiq将无法启动.有关如何使其工作的任何想法?
调节器
def call_warrants_with_date_range
CallLogWorker.perform_async(params[:call_log])
redirect_to call_logs_path, notice: 'Calls were successfully made.'
end
Run Code Online (Sandbox Code Playgroud)
工人
class CallLogWorker
include Sidekiq::Worker
def perform(params[:call_log])
client = Twilio::REST::Client.new TWILIO_ACCOUNT_SID, TWILIO_ACCOUNT_AUTH_TOKEN
start_date = params[:call_log][:warrant_start_date]
end_date = params[:call_log][:warrant_end_date]
query = "SELECT people.id, warrants.warn_type, warrants.warn_date_issued, phone_numbers.phone_number
FROM people
LEFT OUTER JOIN warrants ON people.id = warrants.person_id
LEFT OUTER JOIN phone_numbers ON people.id = phone_numbers.person_id
WHERE warrants.warn_date_issued BETWEEN ? AND ? AND warrants.warn_type = 'AW'"
@numbers = CallLog.find_by_sql(["#{query}", start_date, end_date])
@numbers.each do |dial|
begin
call = client.account.calls.create( …
Run Code Online (Sandbox Code Playgroud) 我正在研究Rails/Ruby应用程序中的地理编码片段/ sidekiq作业.所以基本上当我们点击谷歌API时,我们会睡1秒钟以避免谷歌API查询限制.但是我想要考虑AR和SQL时间来推动信封并加快处理速度.所以我想弄清楚如何睡3/4秒.
我可以睡觉.75还是我需要做一些像睡眠一样的睡眠数学(1.0/??).
不确定睡眠是否可以像.75一样浮动.有什么想法吗?
我们在Herki上有一个带有Sidekiq的Rails应用程序,并且数据库连接不足.
ActiveRecord::ConnectionTimeoutError: could not obtain a database
connection within 5.000 seconds (waited 5.000 seconds)
Run Code Online (Sandbox Code Playgroud)
Heroku的东西:
数据库计划:Standard0(120个连接)
Web dynos:2 Standard-2X
工作人员dynos:1标准-2X
heroku配置:
MAX_THREADS: 5
(DB_POOL not set)
(WEB_CONCURRENCY not set)
Run Code Online (Sandbox Code Playgroud)
Procfile:
web: bundle exec puma -C config/puma.rb
worker: bundle exec sidekiq
Run Code Online (Sandbox Code Playgroud)
database.yml的:
...
production:
url: <%= ENV["DATABASE_URL"] %>
pool: <%= ENV["DB_POOL"] || ENV['MAX_THREADS'] || 5 %>
Run Code Online (Sandbox Code Playgroud)
puma.rb:
# https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#adding-puma-to-your-application
workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['MAX_THREADS'] || 2)
threads threads_count, threads_count
preload_app!
rackup DefaultRackup
port ENV['PORT'] || 3000
environment ENV['RACK_ENV'] || …
Run Code Online (Sandbox Code Playgroud) 这是我的ApplicationController
控制器:
class ApplicationController < ActionController::Base
helper_method :is_admin?
def is_admin?
...
end
end
Run Code Online (Sandbox Code Playgroud)
我想is_admin?
在Sidekiq工作者中使用这个助手.到目前为止,我在这里包括:
class GenerateInvoiceWorker
include Sidekiq::Worker
def perform(product_id)
av = ActionView::Base.new()
av.view_paths = ActionController::Base.view_paths
av.class_eval do
include Rails.application.routes.url_helpers
include ApplicationHelper
end
...
end
end
Run Code Online (Sandbox Code Playgroud)
如何在工作者中使用辅助方法?
谢谢
我有一个包含 2 个作业的 Rails 应用程序(ImportCsvJob 和 ProcessCsvJob)。这样我就可以在应用程序中明显地提示队列中仍然有作业,我有这个辅助方法(在 application_helper.rb 内):
module ApplicationHelper
def queued_job_count
Sidekiq::Queue.new.size
end
end
Run Code Online (Sandbox Code Playgroud)
然后我在索引控制器上使用它,然后将其传递到视图进行处理并在应用程序中给出视觉提示。
def index
@still_have_jobs = !queued_job_count.zero?
end
Run Code Online (Sandbox Code Playgroud)
但是,当我仍然有 1 个后台作业 (ImportCsvJob) 时,此方法有效,但当我添加 (ProcessCsvJob) 时,它不再有效。
导入_csv_job.rb
require 'open-uri'
class ImportCsvJob < ActiveJob::Base
queue_as :default
def perform(csv_record)
csv_record[:object_changes] = ApplicationController.helpers.generate_hash(csv_record[:object_changes])
ObjectRecord.create(csv_record)
end
end
Run Code Online (Sandbox Code Playgroud)
process_csv_job.rb
class ProcessCsvJob < ActiveJob::Base
queue_as :default
def perform(csv_path)
csv_file = open(csv_path,'rb:UTF-8')
options = {
row_sep: :auto, col_sep: ",",
user_provided_headers: [:object_id, :object_type, :timestamp, :object_changes],
remove_empty_values: true,
headers_in_file: true
}
SmarterCSV.process(csv_file, options) do |array| …
Run Code Online (Sandbox Code Playgroud) 我读到有关Sidekiq的内容:
Sidekiq是多线程的,因此您的工作线程必须是线程安全的。
这是什么意思?什么是“线程安全”代码?有人可以举例说明吗?非常感谢你。
ruby model-view-controller multithreading ruby-on-rails sidekiq
我有一个执行状态更改的工作,而且我使用它的方式是,只有在经过一定时间后才会更改状态。
在我的工作课上:
class ItemJob < ApplicationJob
queue_as :default
def perform(item)
item.do_this!
end
end
Run Code Online (Sandbox Code Playgroud)
它是从模型调用的:
def create_item_worker
ItemJob.set(wait: 30.seconds).perform_later(self)
end
Run Code Online (Sandbox Code Playgroud)
但是,这是行不通的,因为 ActiveJob 有一个用于不再存在的记录的作业队列。我输入bundle exec sidekiq
终端,它吐出像ActiveJob::DeserializationError: Error while trying to deserialize arguments: Couldn't find Item with 'id'=67
.
那么我该如何清除呢?Sidekiq::Queue.all.each(&:clear)
似乎没有做任何事情。
像 javascript 的 Promise.all 可以等待所有请求完成,然后执行以下工作。
例如,我有 A、B、C 任务:
C 需要 A 和 B 都完成运行并使用 A 和 B 计算的结果。
(因为 3 个进程都是非常昂贵的计算,所以它们被放在 sidekiq 队列中运行)
sidekiq ×13
ruby-on-rails ×10
ruby ×8
redis ×2
deployment ×1
engineyard ×1
helper ×1
heroku ×1
idempotent ×1