2014-07-12 1 views
0

DB의 테이블을 계속 실행하여 명령을 실행하고 싶습니다. 일부 명령은 완료하는 데 4 분이 소요될 수 있으며 약 10 초가 걸릴 수 있습니다.ruby에서 실시간으로 생성 된 새 스레드에서 비동기 적으로 결과를 수집하는 방법

따라서 스레드로 실행하고 싶습니다. 그래서 모든 레코드가 새로운 스레드를 생성하고 스레드가 생성 된 후에 레코드가 제거됩니다.

DB 조회 + 스레드 생성이 무한 루프에서 실행되기 때문에 스레드에서 '응답'을 얻는 방법 (스레드가 셸 명령을 실행하고 읽고 싶은 응답 코드를 얻습니다)?

나는 무한 루프와 두 개의 스레드 각각 만드는 방법에 대해 생각 : - 첫 번째 새 스레드 을 만드는 DB 조회 +에 대한 - 을위한 ... 어떻게 든 스레드 결과를 읽고 각 응답에

행동 아니면 내가해야 두 번째 fork를 사용하거나 os가 새 프로세스를 생성합니까?

+0

각 명령 스레드가 응답 코드를 가지고 같은 레코드의 한 부분으로, 다시 DB에 저장할 수 있습니까? – Matt

답변

2

각 스레드가 결과를 대기열로 밀어 넣으면 주 스레드가 대기열에서 읽을 수 있습니다. 대기열에서 읽는 것은 기본적으로 차단 작업이므로 결과가 없으면 코드가 차단되어 읽음을 기다립니다. 여기

http://ruby-doc.org/stdlib-2.0.0/libdoc/thread/rdoc/Queue.html

은 예입니다

require 'thread' 

jobs = Queue.new 
results = Queue.new 

thread_pool = [] 
pool_size = 5 

(1..pool_size).each do |i| 
    thread_pool << Thread.new do 
    loop do 
     job = jobs.shift #blocks waiting for a task 
     break if job == "!NO-MORE-JOBS!" 

     #Otherwise, do job... 
     puts "#{i}...." 
     sleep rand(1..5) #Simulate the time it takes to do a job 
     results << "thread#{i} finished #{job}" #Push some result from the job onto the Queue 
     #Go back and get another task from the Queue 
    end 
    end 
end 


#All threads are now blocking waiting for a job... 
puts 'db_stuff' 
db_stuff = [ 
    'job1', 
    'job2', 
    'job3', 
    'job4', 
    'job5', 
    'job6', 
    'job7', 
] 

db_stuff.each do |job| 
    jobs << job 
end 

#Threads are now attacking the Queue like hungry dogs. 

pool_size.times do 
    jobs << "!NO-MORE-JOBS!" 
end 

result_count = 0 

loop do 
    result = results.shift 
    puts "result: #{result}" 
    result_count +=1 
    break if result_count == 7 
end 
+0

대기열에 대해 이야기 할 때'<< "와'shift' 대신에'push'와'pop'이 일반적으로 사용됩니다 –

+0

. 이것은 완벽하게 작동합니다. 한 번만 더 질문합니다. 때로는 스레드가 죽을 수도 있습니다. 새 스레드를 다시 작성하여 풀을 채우는 방법은 무엇입니까? –

관련 문제