2012-05-23 48 views
10

Tôi muốn thực hiện tác vụ 'chạy dài' - (mất khoảng 0,5 giây để thực thi) trong một luồng trong máy chủ web Sinatra.Cách đếm chủ đề đang chạy trong máy chủ ruby ​​

Câu trả lời web mất khoảng 20 ms, vì vậy nếu tôi nhận được bận rộn sau đó chủ đề sẽ chồng chất lên ...

Vì vậy, tôi đã suy nghĩ rằng tôi sẽ làm điều đó đồng bộ nếu tôi nhận được bận rộn ..

if (running_thread_count > 10) 
    stuff_that_takes_a_second() 
else 
    Thread.new do 
     stuff_that_takes_a_second() 
    end 
end 

Làm thế nào để bạn nhận được số lượng các chủ đề đang chạy (Tôi muốn số lượng các luồng được khởi chạy, và chưa thực hiện chạy) - làm thế nào để bạn mã running_thread_count?

def running_thread_count 
return Thread.list.count 
end 

Hoặc tôi có cần kiểm tra các chủ đề đang chạy không? tức là khi một luồng được chạy xong, nó có dừng lại trong Thread.list không?

Tôi không muốn gọi tham gia vì điều đó sẽ đánh bại mục đích - đó là để trả lại nhanh chóng trừ khi chúng tôi được sao lưu với nhiều chuỗi hoạt động.

+0

Nhưng nếu không có 'join', tất cả các chủ đề thoát nếu một trong số họ hoàn thành thực hiện. 'Thread.list.count' lấy số lượng các luồng đang chạy. 'Thread' có một phương thức gọi là' status' trả về '" sleep "' hoặc '" run "' cho các luồng đang được xử lý. Tôi đã thêm mã làm câu trả lời. – Kashyap

+0

Tôi nghĩ rằng một chương trình ruby ​​chạy như một máy chủ web liên tục chạy mọi lúc, để một chuỗi bắt đầu trong một yêu cầu web sẽ chạy đến khi hoàn thành? –

+0

Bạn có một điểm ở đó. Sẽ thử nghiệm nhiều hơn. Cảm ơn bạn – Kashyap

Trả lời

17

này sẽ cung cấp cho các tội danh đề đang gặp tình trạng "chạy" chứ không phải "ngủ"

def running_thread_count 
    Thread.list.select {|thread| thread.status == "run"}.count 
end 
Các vấn đề liên quan