参考的教程链接是
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