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
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. –
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. –
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ó. –