2009-05-22 8 views
28

Yeni kaynak yarattı ve onu akım isteği veya diğer yukarı tutamaz nerede bazı uzun işleme yapması gereken kaynak hazır olmadan önce, nasıl uzakta arka içine işlemeyi gönderebilirim zaman web uygulamamın trafiği Benim modelindeRuby on Rails: Arka planda işler nasıl yürütülür?

:

class User < ActiveRecord::Base 
after_save :background_check 

protected 
def background_check 
    # check through a list of 10000000000001 mil different 
    # databases that takes approx one hour :) 
    if(check_for_record_in_www(self.username)) 
    # code that is run after the 1 hour process is finished. 
    user.update_attribute(:has_record) 
    end 
end 
end 

cevap

39

You should kesinlikle aşağıdaki Railscasts göz atın:

Onlar mümkün olan her yer Rails arka plan işlemleri çalıştırmak için açıklamak yol (aq ile veya olmadan) ueue ...)

+2

Bu günlerde, en çok kullanılan/iyi destekli seçeneklerdir [sidekiq] (https://github.com/mperham/sidekiq), [resque ] (https://github.com/defunkt/resque) ve [delayed_job] (https://github.com/collectiveidea/delayed_job). IMHO, Sidekiq yüksek verimli kuyruklar için en iyisidir ve delayed_job çok düşük verim için en iyisidir. –

+0

Başka bir seçenek, "hizmet olarak" arka plan işlemeyi istiyorsanız ve sunucular veya sıraya alma fikri hakkında endişelenmenize gerek kalmaması için [IronWorker] (http://www.iron.io) 'dir. IronMQ/IronWorker ayrıca otomatik denemeler, görev kayıtları, web sayfaları, vb. Sunar. Rails ile güzel bir şekilde bütünleşir. İşte bazı videolar: https://www.youtube.com/user/ironiodevelopers – Chad

7

bir 'nohup' prepending ve bunu geçmesi komutun sonuna bir '&' ekleyerek, belki de en kolay system ile yapılır ayrı bir süreç, başlatın. (Komut sadece bir dize argümanı değil, bağımsız değişkenler listesi olduğundan emin olun.)

konuları kullanmaya çalışıyorum Bunun yerine diyelim ki, daha bu şekilde yapmak istiyorum çeşitli nedenleri vardır:

  1. Ruby'nin konuları I/O yaparken biraz zor olabilir; Yaptığınız bazı şeylerin tüm sürecin engellenmemesine dikkat etmelisiniz.

  2. Farklı bir ada sahip bir program çalıştırıyorsanız, 'ps' içinde kolayca tanımlanabilir, bu yüzden yanlışlıkla bir FastCGI arka uçunun vahşi ya da başka bir şey yaptığını düşünmeyin ve onu öldürmeyin.

Gerçekten, başlangıç ​​süreci "deamonized," olmalıdır yardım Daemonize sınıfına bakın.

2

İdeal olarak, mevcut bir arka plan iş sunucusunu kendi yazmanızı kullanmak yerine kullanmak istersiniz. Bunlar genellikle bir iş göndermenizi ve ona benzersiz bir anahtar vermenizi sağlar; Daha sonra işyerinizi, web sunucunuzu engellemeden işinizin durumu için düzenli olarak sorgulamak için anahtarı kullanabilirsiniz. Oradaki çeşitli seçeneklerin here is a nice roundup.

0

Ne hakkında:

def background_check 
    exec("script/runner check_for_record_in_www.rb #{self.username}") if fork == nil 
end 

programı "check_for_record_in_www.rb" sonra başka bir işlem çalışır ve veritabanına erişebilir olmak, ActiveRecord erişebilecektir.

1

Ben backgroundrb kullanmayı seviyorum, onun güzel sürece uzun süreçlerde iletişim kurmasını sağlar. Bu nedenle, raylar uygulamanızda statü güncellemelerine sahip olabilirsiniz.

1

Sanırım spawn, sürecinizi engellemenin, arka planda bazı işlemleri gerçekleştirmenin ve kullanıcıya bu işlemin başlatıldığına dair bir onay göstermenin harika bir yoludur.

6

Sadece 'delayed_job' gem ile deneme yapıyordum çünkü Heroku hosting platformu ile çalışıyor ve kurulumu kolaydı!

rake db:migrate Sonra kuyruk işleyicisi ile başlar, Gemfile, bundle install, rails g delayed_job için gem ekleyin; Eğer bunu değiştirmek

company.send_mail_to_all_users 

yani sizin uzun bir süreçtir bir yöntem görüşmesi

RAILS_ENV=production script/delayed_job start 

;

company.delay.send_mail_to_all_users 

Kontrol github tam belgeler: https://github.com/collectiveidea/delayed_job