Я написал программу в Perl, которая использует многопоточность. Я использую эту программу, чтобы понять, как многопоточность реализована в Perl.
Сначала краткий обзор того, что программа намеревается сделать: он будет читать список URL-адресов из текстового файла, по одному за раз. Для каждого URL-адреса он вызывает подпрограмму (передавая URL-адрес в качестве параметра) и отправляя ему запрос HTTP HEAD. После получения заголовков HTTP-ответа он выведет поле заголовка сервера из ответа.
Для каждого URL-адреса он запускает новый поток, который вызывает вышеупомянутую подпрограмму.
Проблема: Основная проблема заключается в том, что программа периодически прерывается. Он работает нормально в другое время. Это, по-видимому, ненадежный код, и я уверен, что есть способ заставить его работать надежно.
Код:
#!/usr/bin/perl
use strict;
use warnings;
use threads;
use WWW::Mechanize;
no warnings 'uninitialized';
open(INPUT,'<','urls.txt') || die("Couldn't open the file in read mode\n");
print "Starting main program\n";
my @threads;
while(my $url = <INPUT>)
{
chomp $url;
my $t = threads->new(\&sub1, $url);
push(@threads,$t);
}
foreach (@threads) {
$_->join;
}
print "End of main program\n";
sub sub1 {
my $site = shift;
sleep 1;
my $mech = WWW::Mechanize->new();
$mech->agent_alias('Windows IE 6');
# trap any error which occurs while sending an HTTP HEAD request to the site
eval{$mech->head($site);};
if([email protected])
{
print "Error connecting to: ".$site."\n";
}
my $response = $mech->response();
print $site." => ".$response->header('Server'),"\n";
}
Вопросы:
Как я могу заставить эту программу работать надежно и в чем причина спорадических сбоев?
Какова цель вызова метода объединения объекта потока?
В соответствии с документацией по приведенной ниже ссылке она будет ждать завершения выполнения потока. Я вызываю метод соединения правильно?
http://perldoc.perl.org/threads.html
Если есть хорошие методы программирования, которые я должен включить в приведенный выше код, сообщите мне.
Мне нужно вызвать sleep() исключительно в коде или не требуется?
В C мы вызываем Sleep() после вызова CreateThread(), чтобы начать выполнение потока.
Что касается сбоя: когда вышеприведенный код Perl неожиданно и спорадически возникает, появляется сообщение об ошибке: "Perl-интерпретатор командной строки перестает работать"
Подробности сбоя:
Fault Module Name: ntdll.dll
Exception Code: c0000008
Вышеуказанный код исключения соответствует: STATUS_INVALID_HANDLE
Возможно, это соответствует недопустимому дескриптору потока.
Информация о моей установке на Perl:
Summary of my perl5 (revision 5 version 14 subversion 2) configuration:
Platform:
osname=MSWin32, osvers=5.2, archname=MSWin32-x86-multi-thread
useithreads=define
Подробная информация о ОС: Win 7 Ultimate, 64-разрядная ОС.
Надеюсь, что этой информации будет достаточно, чтобы найти основную причину проблемы и исправить код.