• perl语言的线程使用


    参考的教程链接是

    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
    ");
           sleep(1);
        }
     }
    
     sub consume {
         sleep(1);
        my $name = shift;
        while(1) {
            my $r = $q->dequeue();# 此处可以插入数据 但是要主要注意的是  数据库要从此线程中打开
            printf("consume $r
    ");
        }
     }
    
     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),"
    ";
    while(1)
    {   if($j>10)
       {    
               print "last";
               last;
    
        }
       
       $j=$j+1;
       #获得一个信号量;当执行的线程数为5时,获取失败,主线程等待。直到有一个线程结束,新的信号量可用。回复正常运行;
       $semaphore->down();    
        print $j,"
    ";
        my $thread=threads->new(&ss,$j,$j); #创建线程;
        $thread->detach();               #剥离线程;
    }
    
    
    &waitquit; 
    
    print localtime(time),"
    ";
    
    sub ss() 
    {   my ($t,$s)=@_;
       sleep($t);
        print "$s	",scalar(threads->list()),"	$j	",localtime(time),"
    ";
       $semaphore->up();                 #当线程执行完成时,释放信号量。
    }
    
    
    sub waitquit
    {    print "Waiting to quit...
    ";
        my $num=0;
       while($num<$max_thread)
       {   $semaphore->down();
          $num++;
           print "$num thread quit...
    ";
        }
        print "All $max_thread thread quit
    ";
    }

    运行的结果:

    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

     

     

     

     

  • 相关阅读:
    BufferedOutputStream
    BufferedInputStream
    IO异常 的处理
    FileOutStream
    FileInputStream
    File常用的方法
    IO流
    枚举
    jdk1.5新特性之-----自动装箱与自动拆箱
    jdk1.5新特性之------->可变参数
  • 原文地址:https://www.cnblogs.com/wanghuixi/p/11926152.html
Copyright © 2020-2023  润新知