加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl Thread 错误避免

发布时间:2020-12-15 20:54:52 所属栏目:大数据 来源:网络整理
导读:一个程序,如下功能,多线程同时下载多个图片并保存。 具体的多线程代码片段如下: use Thread; ...... for my $list (@list){ ? print "Download begin./n"; ? my $thread = Thread-new(/DownLoadFunction,$parameters); ? $thread-join(); } 运行这个程序

一个程序,如下功能,多线程同时下载多个图片并保存。

具体的多线程代码片段如下:

use Thread;
......
for my $list (@list){
? print "Download begin./n";
? my $thread = Thread->new(/&DownLoadFunction,$parameters);
? $thread->join();
}

运行这个程序你将发现,程序并没有并发的多线程,同时会出现一些意外情况,这个自己可以试试看,写一些简单的实现去测试并发现错误的类型。

对此,我们加以修改,如下:

use Thread;
......
my @threadlist;
for my $list (@list){
? print "Download begin./n";
? my $thread = Thread->new(/&DownLoadFunction,$parameters);
? push @threadlist,$thread;
}
foreach my $thread (@threadlist){
? $thread->join();
}


运行这个程序,则会按照我们预计的情况并发执行下载任务。

注意:正确的应该是先将所有的thread都放到一个list中,然后对他们进行join。

在Windows中,我们也可以使用fork来进行多线程的执行,与thread有相同的效果,代码如下:

for my $list (@list){
? my $child = fork();
? if($child){
??? # child > 0,so we are the parent
??? print "Download begin./n";
? }else{
??? # child = 0,handle child
??? DownLoadFunction($parameters);
??? exit 0;
? }
}

注意:必须使用exit 0 来推出线程,否则将会出错,具体的代码自己可以完成并测试。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读