2008-11-20 15 views

cevap

24

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.

+1

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

+7

Bu, Windows'ta hiç çalışmayacak – vava

+6

@Vadim Bu bir özellik değil, bir hata olduğunu düşünüyorum. –

36

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" 
+0

Tatlı, bu harika bir ipucu oldu. –

+1

Yukarıda ve kabul edilen yanıtta Process.wait öğesini nereye ve nasıl yerleştirirsiniz? – iamtoc

+7

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

2

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.

+0

Muhtemelen bunlar doğru işletim sistemi konuları yerine Yeşil Konular mı? –

+2

Ruby 1.9 ile ilgili bunu okuyun: http://www.igvita.com/2008/11/13/concurrency-is-a-myth-in-ruby/ –

+0

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

2

çatal/exec için iyi bir alternatif bakınız/yumurtlama POSIX doğuş Ruby 1.9 gem alt seviye yöntemleri.