Perl Multi Threaded Program偶尔会崩溃

 浅唱_夏染_744 发布于 2023-01-20 14:32

我在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位操作系统.

希望这些信息足以找到问题的根本原因并更正代码.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有