Ana işlemimde bir kod bloğunu eşzamanlı çalışmasını sağlamak için alt işlemlere bırakmak istiyorum. Ayrıca, ortaya çıkan çocuk sürecinin PID'sine sahip olmak istiyorum, böylece gerekirse izleyebilir ve öldürebilirim.Ruby'de çocuk süreçlerini nasıl doğuruyorsunuz?
cevap
fork
kernel yöntemini kullanabilirsiniz. Bir örnek:
#!/usr/bin/env ruby
puts "This is the master process."
child_pid = fork do
puts "This is the child process"
exit
end
puts "The PID of the child process is #{child_pid}"
fork
yöntem çatal sürecin PID döner ve geçirilen blok herhangi bir kod çalıştırır. Düzenli Ruby blokları gibi, ana sürecin bağlantılarını tutar.
exit
çatallı işleminizi yapmak iyi bir fikirdir.
Chris'in mükemmel cevabına ek olarak, çocuğunuzun sürecini tamamlamak için ustanızdan Process.wait
numaralı telefonu aramayı unutmayın, aksi takdirde zombileri geride bırakacaksınız.
Örnek yorumlarda istendiği gibi: Eğer konu yerine İşlemler kullanmak mutluyuz, bu gibi sonra bir şey biraz daha ölçeklenebilir olabilir
pid = Process.fork do
puts "child, pid #{Process.pid} sleeping..."
sleep 5
puts "child exiting"
end
puts "parent, pid #{Process.pid}, waiting on child pid #{pid}"
Process.wait
puts "parent exiting"
Tatlı, bu harika bir ipucu oldu. –
Yukarıda ve kabul edilen yanıtta Process.wait öğesini nereye ve nasıl yerleştirirsiniz? – iamtoc
Argümanı olmayan 'Process.wait 'öğesinin _any_ child için beklediğini unutmayın. Bu nedenle, daha genel bir durumda, yukarıdaki belirli alt işlem çıkmıyorsa bile, bu kod snippet'i üst öğeden çıkar. Daha kesin bir sürümü yerine 'Process.wait (pid)' diyecek. – sameers
daha-daha-bir çatal:
def doit(x)
sleep(rand(10))
puts "Done... #{x}"
end
thingstodo = ["a","b","c","d","e","f","g"]
tasklist = []
# Set the threads going
thingstodo.each { |thing|
task = Thread.new(thing) { |this| doit(this) }
tasklist << task
}
# Wait for the threads to finish
tasklist.each { |task|
task.join
}
Lütfen Ruby yürütme modeli ve kısıtlamaları ile ilgili olarak John Topley'in mükemmel yorumları ve referansını inceleyin.
Sadece bir göze batan hatası (göreve atama yok) düzeltmek için ve takip etmek @ (Jason King) 'in tavsiyesi düzenlenebilir.
Muhtemelen bunlar doğru işletim sistemi konuları yerine Yeşil Konular mı? –
Ruby 1.9 ile ilgili bunu okuyun: http://www.igvita.com/2008/11/13/concurrency-is-a-myth-in-ruby/ –
Olmalı: 'Thread.new (thing) {| it | doit (it)} ' Her şey yinelemede 'şey' sıfırlandığından, doğru iş parçacığının doğru şeyi alacağı konusunda hiçbir garanti yoktur. – smathy
1.9'da Process.spawn komutunu kullanabilirsiniz. Sert işin en kolay, verimli bir hale getirmek için mi https://github.com/rtomayko/posix-spawn
ve esnek göre: da http://en.wikibooks.org/wiki/Ruby_Programming/Running_Multiple_Processes
çatal/exec için iyi bir alternatif bakınız/yumurtlama POSIX doğuş Ruby 1.9 gem alt seviye yöntemleri.
- 1. Süpervizör var Çocuk süreçlerini periyodik olarak yeniden başlatın
- 2. Tüm alt iş süreçlerini nasıl sonlandırırım?
- 3. MPI süreçlerini çatalla anında mı yaratıyorsunuz?
- 4. Nasıl zsh tüm arka plan süreçlerini öldürmek için?
- 5. Bir çocuk sürecini profillemek için dottrace nasıl edinilir?
- 6. Çocuk sayısını nasıl sayabilirim?
- 7. Çocuk düğümlerini nasıl ayrıştırırım?
- 8. Jenkins çocuk süreçleri nasıl sınırlandırılır?
- 9. Çocuk projeleri nasıl inşa edilir?
- 10. nasıl bazı özel çocuk döngü
- 11. Çocuk bir LegendItem'e nasıl eklenir?
- 12. Leiningen - çocuk sürecini nasıl öldürebilirim?
- 13. CSS: Geçen-çocuk: değil (: Sadece-çocuk) Şu
- 14. çocuk süreç
- 15. Çocuk yüksekliği
- 16. Android Çocuk ekle
- 17. MyBatis Ebeveyn Çocuk ilişkisi
- 18. Django: hayır çocuk elemanları
- 19. JavaScript'te çocuk nesnelerine erişme
- 20. Çocuk Android Üzerine Tıklayın
- 21. Çocuk div max yüksekliğini
- 22. CSS acil çocuk seçici
- 23. LINQ çocuk kayıtları sıfır
- 24. sahte çocuk sınıfına
- 25. çocuk açık kullanılarak oluşturuldu
- 26. çocuk POSIX iplik iptal edilir nasıl
- 27. Firebase Android için, nasıl bir çocuk aracılığıyla
- 28. Çocuk kayıtlarında ebeveynin silinmesini nasıl önleyebilirim?
- 29. React'ta bir çocuk düğümüne nasıl erişirim?
- 30. Çocuk varlıkları koleksiyonları yüklemeli olarak nasıl filtrelenir?
Ruby ile hatırlamak için bir şey, her şeyin Windows ile aynı şekilde çalışmadığıdır * nix. Bazen Windows'da tamamen kullanılmazlar, bu yüzden kendi tehlikenizde kullanın. – Daemin
Bu, Windows'ta hiç çalışmayacak – vava
@Vadim Bu bir özellik değil, bir hata olduğunu düşünüyorum. –