2009-10-22 9 views
10

Ryan Tomayko đã chạm vào một cơn bão lửa với this post về cách sử dụng các lệnh điều khiển quy trình Unix.Sử dụng phương pháp điều khiển quy trình Unix trong Ruby

Chúng ta nên làm nhiều việc hơn. Rất nhiều điều này. Tôi đang nói về ngã ba (2), thực hiện (2), ống (2), socketpair (2), chọn (2), giết (2), sigaction (2), và vv và vv. Đây là những người bạn của chúng tôi. Họ rất muốn giúp đỡ chúng tôi.

Tôi có một chút mã (một delayed_job bản sao cho DataMapper mà tôi cho là phù hợp với điều này, nhưng tôi không rõ ràng về cách tận dụng các lệnh được liệt kê. mã này?

def start 
    say "*** Starting job worker #{@name}" 
    t = Thread.new do 
    loop do 
     delay = Update.work_off(self) 
     break if $exit 
     sleep delay 
     break if $exit 
    end 
    clear_locks 
    end 

    trap('TERM') { terminate_with t } 
    trap('INT') { terminate_with t } 

    trap('USR1') do 
    say "Wakeup Signal Caught" 
    t.run 
    end 
end 

Trả lời

3

Ahh có ... sự nguy hiểm của "Chúng ta nên làm nhiều hơn nữa những điều này" mà không giải thích những gì mỗi người trong số những người làm và trong hoàn cảnh nào bạn muốn sử dụng chúng. Đối với một cái gì đó giống như delayed_job bạn thậm chí có thể sử dụng fork mà không biết rằng bạn đang sử dụng fork. Điều đó nói rằng, nó thực sự không quan trọng. Ryan đã nói về việc sử dụng fork cho các máy chủ preforking. delayed_job sẽ sử dụng fork để chuyển một quy trình thành một daemon. Cùng một cuộc gọi hệ thống, mục đích khác nhau. Chạy delayed_job ở mặt trước (không có fork) so với nền sau (với fork) sẽ dẫn đến chênh lệch hiệu suất không đáng kể.

Tuy nhiên, nếu bạn viết máy chủ chấp nhận kết nối đồng thời, giờ đây lời khuyên của Ryan là đúng về số tiền.

  • fork: tạo một bản sao của quá trình ban đầu
  • execve: ngừng thực hiện các tập tin hiện tại và bắt đầu thực hiện một tập tin mới trong quá trình tương tự (rất hữu ích trong công việc cào)
  • pipe: tạo ra một đường ống (hai file descriptor, một cho đọc, một cho ghi)
  • socketpair: giống như một đường ống, nhưng đối với ổ cắm
  • select: cho phép của bạn chờ đợi cho một hoặc nhiều nhiều file descriptor được đọc y với một thời gian chờ
  • kill: sử dụng để gửi một tín hiệu tới một quá trình
  • sigaction: cho phép bạn thay đổi những gì sẽ xảy ra khi một quá trình nhận được một tín hiệu
+0

Vì vậy, thay vì tạo một chủ đề (xanh lá cây), tôi có thể sử dụng fork (2) thay vào đó và git một PID trở lại. Điều này nhiều tôi đã làm. Làm thế nào để tôi làm việc với block cho bẫy ('USR1') mà đánh thức các thread khi tôi mới công việc truy cập hàng đợi? Làm thế nào tôi sẽ tạo ra nhiều hơn sau đó một quá trình và nhận được chúng để kéo ra khỏi hàng đợi tối ưu. Ma thuật có vẻ như đang ở trong đường ống và chọn nhưng tôi không hiểu những phức tạp. Tôi có thể sử dụng đá quý daemon để tạo ra một quá trình daemon sử dụng ngã ba dưới mui xe. Tôi muốn bắt đầu một số tiến trình con để chạy hàng đợi. –

+0

Tùy thuộc vào "công việc" có nghĩa là gì trong ngữ cảnh này. Nếu "work" là I/O, nó có thể khác và yeah, 'select' là quan trọng. Tôi thích thiết kế hàng đợi công việc theo cách mà công việc có thể được thực thi theo bất kỳ thứ tự nào. Vì vậy, nếu đơn vị công việC# 1 được thực thi đồng thời với đơn vị công việC# 2, đó không phải là vấn đề. Đối với đá quý daemon ... Tôi đã từng sử dụng nó, nhưng bây giờ tôi sử dụng 'fork' trực tiếp hoặc tôi sử dụng thư viện ChainGang của mình.Tôi thấy rằng daemon giấu quá nhiều thứ quan trọng, và nó là chi phí không cần thiết cho một cái gì đó thực sự không phải là khó khăn. Lưu ý rằng ChainGang có chất lượng rất cao. –

+0

Về cơ bản, đáng lo ngại về việc "kéo ra khỏi hàng đợi tối ưu" không tạo ra nhiều ý nghĩa trong hầu hết các ngữ cảnh. Hoặc bạn đang làm việc với I/O, trong trường hợp đó bạn có thể không sử dụng hàng đợi 'delay_job' hoặc bạn đang thực hiện những thứ như các đơn vị công việc rời rạc, trong trường hợp đó' select' và 'pipe' không thực hiện bất kỳ giác quan. Dù bằng cách nào, đúng cách để đối phó với một hàng đợi công việc là chỉ cần lấy bất cứ điều gì trên đầu trang bất cứ khi nào bạn đang miễn phí. Và nếu không có gì ở đó, nó có thể OK để chỉ chặn cho đến khi có. –