一个程序,如下功能,多线程同时下载多个图片并保存。
具体的多线程代码片段如下:
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 来推出线程,否则将会出错,具体的代码自己可以完成并测试。
Perl Thread 错误避免
最新推荐文章于 2023-12-19 00:28:28 发布