2009-10-14 15 views
6

Raylar uygulamasından bir yönteme "arka plana" çatal kullanmanın iyi bir fikir olup olmadığı konusunda biraz düşünmek isterim ..., artıları? Eksileri?

Çatallarımdan ne aldım {my_method; Süreci # setsid} aslında yapması gereken şeyi yapar.

1) tamamlamak için çatalın)

3) bekleyen o kadar çocuk yürütür w/o devam (örn arama işlemini kesintiye olmayan bir başka PID

2) başka bir işlemler yaratır

'u tamamladıktan sonra, iyi bir fikir mi? Çatal tam olarak ne yapıyor? Tüm raylarımın mafsalı/yolcu örneğinin bir kopyası mı? Eğer öyleyse bu çok kötü olur. Ya da, bir şekilde büyük bir hafıza belleği tüketmeden yapar.

Benim nihai hedefi bu süreçlerin (öncelikle e-posta gönderme) çatallanmasını lehine benim arka plan cini/kuyruk sistemi ile deplasmanda yapılacak - ama bu bellekten tasarruf etmezse o zaman kesinlikle yanlış yönde atılmış bir adım

+0

Kuyruk sistemi ile yapışırdım. Bunun için iyi hazırlanmış bir paket kullanıyorsanız, çatal bombardıman patlamaları ve iyi bir kuyruk sistemi için gereken diğer birçok ayrıntı hakkında endişelenmenize gerek kalmayacaktır. Bu, açık bir gereklilik olmadıkça kendi kodunuzu yuvarlama konusunda dikkatli olmanız gereken bir durumdur. –

+0

kuyruk sunucusu ++. E-posta kuyruğu için MQ (http://github.com/mdarby/mq) kontrol etmek isteyebilirsiniz. Üretimde hiçbir sorun olmadan aylar boyunca kullandım. –

cevap

0

Çatalın semantiği, sürecin tüm bellek alanını yeni bir işleme kopyalamaktır, ancak çoğu (çoğu?) Sistem bunu sanal bellek tablolarının bir kopyasını yaparak ve üzerine yazma üzerine yazarak yapar. Bu, (ilk başta, en azından), yeni tabloları ve diğer işlem başına veri yapılarını oluşturmak için yeterli olan çok daha fazla fiziksel belleği kullanmadığı anlamına gelir.

Bu, Ruby, RoR, vb yazma-on-yazma forking ile nasıl etkileşime girdiğinden emin değilim. Özellikle çöp toplama, birçok bellek sayfasına dokunursa sorun yaratabilir (kopyalanmasına neden olur).

+0

COW ile ilgili her iki şeyi de duydum ... eminim ki, 1.8 şubesinin bir kısmı bunu desteklemiyor, ancak REE bunu yapıyor (?). Ve ikisinin de 1.9 olduğunu ve COW'u desteklemediğini duydum. dedi , * o *, benim raylar eylemi hayal bile: def sonuna do_more_stuff fork_and_send_email do_stuff foo çatal İNEK orijinal bellek yeri anında nedeniyle (değiştirilemez olmazdı bile neyi Bundan sonra gelir ve böylece bir kopyasını kışkırtır? Çatal son yöntem çağrısı olsa bile. Rayların hala bir şeyler yaptıklarını hayal etmeyi düşünürdüm, aynı süreçte bir sonraki talepte bulunmayacağım. jsharpe

+0

Dürüstlük, biçimlendirme yorumlama: def foo; şeyler yapmak; fork_and_send_email; do_more_stuff; son – jsharpe

+0

Evet, bazı kopyalar oluşuyordu, ama umarım bu işlemin tüm bellek alanı olmazdı; daha ziyade burada ve orada tek tek hafıza sayfaları olacaktır (x86 bellek sayfalarında genellikle 4 kilobayttır). – wdebeaum

4

Çatal, tüm işleminizin bir kopyasını ve uygulama sunucusuna tam olarak nasıl bağlandığınıza bağlı olarak, bunun bir kopyasını da yapar. Diğer tartışmalarda da belirtildiği gibi bu, kopyalama-yazma ile yapılır, bu yüzden tolere edilebilir. Unix, çatal (2) etrafında inşa edilir, sonuçta, onu oldukça hızlı bir şekilde yönetmek zorundadır. Kısmen arabelleğe alınmış G/Ç, açık dosyalar ve diğer birçok öğenin kopyalanmasının yanı sıra, bunların yazılması için yayınlanmış olan programın durumu da hatalı olacağını unutmayın.

  • Eylem Mailer kullanıyorsunuz:

    Ben birkaç düşünce var? E-posta, AM veya Process.popen bir şey ile kolayca yapılabilir gibi görünüyor. (Popen bir çatal yapacak, ancak hemen bir exec tarafından takip edilecektir.)
  • , bir başka ruby ​​yorumlayıcısının artı işlevselliğinizi Process.exec yürüterek bu durumdan derhal kurtulacaktır. Aktarılacak çok fazla durum varsa veya gerçekten bu yinelenen dosya tanıtıcılarını kullanmanız gerekiyorsa, bunun yerine alt işlem işini gönderebilmeniz için IO#popen gibi bir şey yapabilirsiniz. Sistem, alt işlemin Ruby yorumlayıcısının metnini içeren sayfaları otomatik olarak ebeveynle paylaşır. Yukarıdakilere ek olarak,
  • , daemons geminin kullanımını düşünebilirsiniz. Raylarınız zaten bir servisteyken, gemiyi kullanmak, bir toplu iş sunucusu olarak çalışan bir arka plan görevini daha kolay tutmayı ve başlatmayı, izlemeyi, bombalamadan sonra yeniden başlatmayı ve yaptığınız zaman kapatmayı kolaylaştırabilir. .Bir fork(2) ed alt işlemi çıkış yaparsanız
  • , tür
:-) benim için iyi bir çözüm gibi geliyor, exit! yerine bir ileti kuyruğu ve senin gibi zaten kurulmuş bir cini sahip
  • exit kullanımı
  • 1

    Çatal() uygulanmadığından (henüz), JRuby'yi Raylar üzerinden kullanmanızı engelleyeceğini unutmayın.

    İlgili konular