我在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 = ) { 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($@) { print "Error connecting to: ".$site."\n"; } my $response = $mech->response(); print $site." => ".$response->header('Server'),"\n"; }
问题:
如何使这个程序可靠地工作,以及零星崩溃的原因是什么?
调用线程对象的join方法的目的是什么?
根据下面链接的文档,它将等待线程执行完成.我正确调用了连接方法吗?
http://perldoc.perl.org/threads.html
如果我必须在上面的代码中包含任何良好的编程习惯,请告诉我.
我是否需要在代码中专门调用sleep()或者不需要它?
在C中,我们在调用CreateThread()之后调用Sleep()来开始执行线程.
关于崩溃:当上面的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位操作系统.
希望这些信息足以找到问题的根本原因并更正代码.