• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

perl语言的线程使用

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

参考的教程链接是

https://www.cnblogs.com/migrantworkers/p/6973459.html

 

1.Perl 多线程的使用,join 和 detach 的区别 ,join 会阻塞主线线程, detach  会把子线程从主线程中剥离出去,不会阻塞主线程。

2.很多的时候需要多线程访问数据库但是在多线程访问数据库的时候会出现问题,很多时候不支持多想成对数据库进行写操作,在此我们可以用perl的queue 的方法是多线程分别往队列中添加数据,一个线程负责写入数据库,这样可以提升效率。

#!/usr/bin/perl

use threads;
use Thread::Queue;

my $q = Thread::Queue->new();


sub produce {
my $name = shift;
for(my $i=0;$i<10;$i++) {
 my $r = $i;
        $q->enqueue($r);
        printf("$name  $r\n");
       sleep(1);
    }
 }

 sub consume {
     sleep(1);
    my $name = shift;
    while(1) {
        my $r = $q->dequeue();# 此处可以插入数据 但是要主要注意的是  数据库要从此线程中打开
        printf("consume $r\n");
    }
 }

 my $producer1 = threads->create(\&produce, "producer1");
 my $producer2 = threads->create(\&produce, "producer2");
 my $consumer1 = threads->create(\&consume, "consumer2");

 $producer1->join();
 $producer2->join();
 $consumer1->join();

 print "sdfsdfdsf";

 3.如果采用detach 的方式开启线程 有可能会出现一种情况  就是  主线程会在子线程前结束,这样会终止 子线程的运行,所以要控制主线程的结束时间 一种就是通过延时将 主线程等待子线程的结束 才结束,最好的方法采用信号量的方式告诉主线程结束


#!/usr/bin/perl
use threads;
use Thread::Semaphore;
my $j=0;
my $thread;my $max_threads=3;
my $semaphore=new Thread::Semaphore($max_threads);

print localtime(time),"\n";
while(1)
{   if($j>10)
   {    
           print "last";
           last;

    }
   
   $j=$j+1;
   #获得一个信号量;当执行的线程数为5时,获取失败,主线程等待。直到有一个线程结束,新的信号量可用。回复正常运行;
   $semaphore->down();    
    print $j,"\n";
    my $thread=threads->new(\&ss,$j,$j); #创建线程;
    $thread->detach();               #剥离线程;
}


&waitquit; 

print localtime(time),"\n";

sub ss() 
{   my ($t,$s)=@_;
   sleep($t);
    print "$s\t",scalar(threads->list()),"\t$j\t",localtime(time),"\n";
   $semaphore->up();                 #当线程执行完成时,释放信号量。
}


sub waitquit
{    print "Waiting to quit...\n";
    my $num=0;
   while($num<$max_thread)
   {   $semaphore->down();
      $num++;
       print "$num thread quit...\n";
    }
    print "All $max_thread thread quit\n";
}

 

运行的结果:

35410201111953530
1
2
3
1 0 1 45410201111953530
4
2 0 2 55410201111953530
5
3 0 3 65410201111953530
6
4 0 4 85410201111953530
7
5 0 5 105410201111953530
8
6 0 6 125410201111953530
9
7 0 7 155410201111953530
10
8 0 8 185410201111953530
11
lastWaiting to quit...
All thread quit
185410201111953530

 

 

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
JSP,PHP,Python,Ruby,Perl概要及各自特点发布时间:2022-07-22
下一篇:
Perl获取匹配行之后的后几行发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap