استخدام أساليب التحكم في العمليات Unix في روبي
-
05-07-2019 - |
سؤال
أثار رايان تومايكو عاصفة نارية كبيرة هذا المشنور حول استخدام أوامر التحكم في عمليات Unix.
ينبغي لنا أن نفعل المزيد من هذا.الكثير من هذا.أنا أتحدث عن fork(2) وexecve(2) وpipe(2) وsocketpair(2) وselect(2) وkill(2) وsigaction(2) وما إلى ذلك وما إلى ذلك.هؤلاء هم أصدقاؤنا.إنهم يريدون بشدة مساعدتنا فقط.
لدي القليل من الكود (a delayed_job
استنساخ لـ DataMapper الذي أعتقد أنه سيتناسب تمامًا مع هذا، لكنني لست واضحًا بشأن كيفية الاستفادة من الأوامر المدرجة.أي أفكار حول كيفية تحسين هذا الرمز؟
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
المحلول
اه نعم...مخاطر عبارة "يجب أن نفعل المزيد من هذا" دون توضيح ما يفعله كل واحد منهم وفي أي ظروف ستستخدمهم.لشيء مثل delayed_job
ربما تستخدمه أيضًا fork
دون أن تعرف أنك تستخدم fork
.ومع ذلك، لا يهم حقا.كان رايان يتحدث عن الاستخدام fork
للخوادم المسبقة. delayed_job
سوف تستخدم fork
لتحويل العملية إلى البرنامج الخفي.نفس استدعاء النظام، وأغراض مختلفة.جري delayed_job
في المقدمة (بدون fork
) مقابل في الخلفية (مع fork
) سيؤدي إلى اختلاف طفيف في الأداء.
ومع ذلك، إذا كتبت خادمًا يقبل الاتصالات المتزامنة، فإن نصيحة ريان الآن صحيحة فيما يتعلق بالمال.
fork
:يقوم بإنشاء نسخة من العملية الأصليةexecve
:يتوقف عن تنفيذ الملف الحالي ويبدأ في تنفيذ ملف جديد في نفس العملية (مفيد جدًا في مهام Rake)pipe
:إنشاء أنبوب (واصفان للملفات، أحدهما للقراءة والآخر للكتابة)socketpair
:مثل الأنابيب، ولكن للمآخذselect
:دعنا ننتظر حتى يصبح واحد أو أكثر من واصفات الملفات المتعددة جاهزًا بعد انتهاء المهلةkill
:تستخدم لإرسال إشارة إلى العمليةsigaction
:يتيح لك تغيير ما يحدث عندما تتلقى العملية إشارة
نصائح أخرى
وبعد 5 أشهر، يمكنك عرض الحل الخاص بي على http://github.com/antarestrader/Updater.انظر إلى lib/updater/fork_worker.rb