2013-03-25 14 views
7

Birden çok işçiyi çalıştırdığım bir kurulumda gecikmiş işi kullanıyorum. Sorunun hatırı sayılır bir şey değil, ama 10 işçiyi çalıştırdığımı söyleyeyim (bunu şu anda geliştirme modunda yapıyor).Aynı işi başlayan birden çok gecikmeli iş süreci

ben yaşıyorum sorun iki farklı işçiler bazen işim nesne üzerinde yöntemini gerçekleştirmek çağırarak, aynı iş üzerinde çalışmaya başlamak olmasıdır.

Anlayışımın en iyisine Gecikmeli İş, bunun olmasını önlemek için kötümser kilitleme kullanıyor, ancak bazen ilk işçinin gerçekten kilitlemek için zamanına sahip olmadan önce işi çalmasını kilitlemek için yeterli zaman var gibi görünüyor.

Sadece başkasının bu sorunu yaşadı görmek için soruyorum, yoksa benim kurulum ise hatalı çalışıyor söyledi. Postrgres kullanıyorum ve bu hem dev makinemde hem de onu barındırdığım Heroku'da oluyor.

benim işlerin içinde etrafında çalışmak için çalışacağız, ama yine de bunun gerçekleşmesini biraz problemlidir. İdeal olarak, gecikmiş işlerin aynı iş üzerinde iki süreçten geçtiği asla gerçekleşmezdi.

Teşekkürler!

+0

Benzer bir şey görüyorum. Tamamen tam olarak takip edemedim, ama bir kilit kontrolü yapmak ve kilidi yapmak arasında, birden çok işçi işi kapıyor ve yürütüyor. –

+0

Bir başlatıcıda '' 'Gecikmeli :: Worker.read_ahead = 1''' ayarı ayarını hafifletmek gibi görünüyordu bulduğumu söylemeliyim. –

+0

Resque ile aynı sorunu vardı, bir çözüm bulamadı –

cevap

0

Biz 12 işçi ile gecikmiş işin içinden yaklaşık 60 milyon yeni iş çalıştırmak ve bunun bir rapor olmadı. Gecikmiş iş çalışanınızın çalıştığı SQL nedir? Postgres kilitleme davranışını değiştiren bir mücevher kullanıyor musunuz?

UPDATE "delayed_jobs" SET locked_at = '2014-05-02 21:16:35.419748', locked_by = 
'host:whatever.local pid:4729' WHERE id IN (SELECT id FROM "delayed_jobs" 
WHERE ((run_at <= '2014-05-02 21:16:35.415923' 
AND (locked_at IS NULL OR locked_at < '2014-05-02 17:16:35.415947') 
OR locked_by = 'host:whatever.local pid:4729') AND failed_at IS NULL) 
ORDER BY priority ASC, run_at ASC LIMIT 1 FOR UPDATE) RETURNING * 

başka kodla ilgili sorunları kilitleme var mı: İşte

DJ sql benim için böyle görünüyor? Eğer konsol oturumları iki ray çalışan ve bunu yaparken deneyebilir misiniz:

Konsol 1. Oturum:

User.find(1).with_lock do sleep(10); puts "worker 1 done" end 

Konsol 2. Oturum:

User.find(1).with_lock do sleep(1); puts "worker 2 done" end 

Başlat ikisi de aynı anda o ve 2 bitmeden eğer 1, iş gecikmeli daha genel bir kilitleme sorun var.