هل هناك طريقة لإجراء عمليات مُدارة في Perl (على سبيل المثال؟استبدال المواضيع التي تعمل فعلا)؟

StackOverflow https://stackoverflow.com/questions/138696

سؤال

لدي تطبيق متعدد الخيوط في لغة Perl والذي يجب أن أعتمد فيه على عدة وحدات آمنة غير خيطية، لذلك كنت أستخدمه fork()عمليات إد مع kill() إشارات كواجهة تمرير الرسائل.

تكمن المشكلة في أن معالجي الإشارة غير منتظمين بعض الشيء (على أقل تقدير) وغالبًا ما ينتهي بهم الأمر بعمليات يتم قتلها في حالات غير مناسبة.

هل هناك طريقة أفضل للقيام بذلك؟

هل كانت مفيدة؟

المحلول

القي نظرة على forks.pm, ، "استبدال مباشر لسلاسل رسائل Perl باستخدام fork()" مما يجعل استخدام الذاكرة أكثر منطقية (ولكن لا تستخدمه على Win32).سيسمح لك بالإعلان عن المتغيرات "المشتركة" ثم يقوم تلقائيًا بتمرير التغييرات التي تم إجراؤها على هذه المتغيرات بين العمليات (على غرار الطريقة التي يقوم بها Threads.pm بالأشياء).

نصائح أخرى

اعتمادًا على ما يحتاج برنامجك إلى القيام به بالضبط، قد تفكر في استخدام بو, ، وهو إطار عمل Perl للتطبيقات متعددة الخيوط ذات سلاسل رسائل مساحة المستخدم.إنها معقدة، ولكنها أنيقة وقوية ويمكن أن تساعدك على تجنب الوحدات غير الآمنة لسلسلة العمليات عن طريق حصر النشاط في سلسلة محادثات مترجم Perl واحدة.

موارد مفيدة للبدء:

  • برمجة بو العرض الذي قدمه مات سيرجنت (ابدأ هنا لفهم ما هو وما يفعله)
  • صفحة مشروع POE (الكثير من أمثلة كتب الطبخ)

بالإضافة إلى أن هناك المئات من تلك التي تم بناؤها مسبقًا مكونات بو يمكنك استخدامها للتجميع في التطبيق.

يمكنك دائمًا أن يكون لديك قناة بين الوالدين والطفل لتمرير الرسائل ذهابًا وإيابًا.

pipe my $reader, my $writer;
my $pid = fork();
if ( $pid == 0 ) {
    close $reader;
    ...
}
else {
    close $writer;
    my $msg_from_child = <$reader>;
    ....
}

ليست طريقة مريحة جدًا للبرمجة، لكن لا ينبغي أن تكون "غير منتظمة".

بدءًا من الإصدار 5.8 من Perl وما بعده، يجب أن تنظر إلى وحدة المواضيع الأساسية.القي نظرة على http://metacpan.org/pod/threads

إذا كنت ترغب في استخدام الوحدات النمطية غير الآمنة لمؤشر الترابط، فيمكنك عادةً تحميلها بالطلب والاستيراد داخل نقطة إدخال مؤشر الترابط.

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