سؤال

أنا أقوم بتشغيل 40 درجة مئوية مع الروتين الفرعي التالي:

my $app = shift;
my $ua = LWP::UserAgent->new();
$ua->timeout(5);
my $response = $ua->get($$app{'watch_url'});
my $new_md5;
if ($response->is_success()) {
    $new_md5 = md5_hex($response->content());
}
return ($$app{'short_name'}, $$app{'watch_md5'}, $new_md5);

مقالب الأساسية تتبع حوالي 3/4 من الوقت. LWP و LWP :: UserAgent هي perl نقية، لذلك أنا اشتعلت خارج الحرس من هذا. هو LWP :: UserAgent غير آمن للخيط؟

تحديث:

إليك الإصدار الأدنى لإعادة إنتاج المشكلة:

use strict;
use warnings;
use threads;
use LWP::UserAgent;

sub check_app {
    my $ua = LWP::UserAgent->new();
    $ua->timeout(5);
    $ua->get('http://www.flatdoc.com/?' . rand(10));
}

my @threads;
for (my $i = 0; $i < 40; $i++) {
    my $thread = threads->create(\&check_app);
    push(@threads, $thread);
}
foreach (@threads) {
    $_->join();
}
هل كانت مفيدة؟

المحلول

لا يتسبب رمز غير مؤمن في Pure-Perl في Segfault (في الواقع، لا يجب أن يسبب أي رمز Perl النقي Segfault). علة في بيرل تسبب segfault. والخيوط في بيرل هي تاريخيا جدا عربات التي تجرها الدواب، لكنهم حصلوا على أفضل بكثير.

يدير الكود الخاص بك بشكل جيد في 5.10.1 و http :: Lite ربما لا دغدغة مهما كان علة بيرل التي قمت بتشغيلها. من المحتمل أنك تحتاج فقط إلى استخدام إصدار أحدث من بيرل. الأكبر سنا وأقرب من ريدهات تحصل عليه، فإن الخيوط الأقل مستقرة هي. إذا كنت ستستخدم الخيوط، استخدم أحدث بيرل يمكنك الحصول على يديك.

كبديل للمواضيع، يمكنك استخدام شيء مثل موازية :: forkmanager., LWP :: متوازي أو حتى مذهلة شوك الوحدة التي تحث المواضيع باستخدام الشوكة.

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