سؤال

أثار رايان تومايكو عاصفة نارية كبيرة هذا المشنور حول استخدام أوامر التحكم في عمليات 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top