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=;$i<;$i++) {
my $r = $i;
$q->enqueue($r);
printf("$name $r\n");
sleep();
}
} sub consume {
sleep();
my $name = shift;
while() {
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=;
my $thread;my $max_threads=;
my $semaphore=new Thread::Semaphore($max_threads); print localtime(time),"\n";
while()
{ if($j>)
{
print "last";
last; } $j=$j+;
#获得一个信号量;当执行的线程数为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=;
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
perl语言的线程使用的更多相关文章
- Perl语言
Perl是高级.通用.直译式.动态的程序语言家族.最初设计者拉里·沃尔(Larry Wall)为了让在UNIX上进行报表处理的工作变得更方便,决定开发一个通用的脚本语言,而在1987年12月18日发表 ...
- Perl语言——简单说明
Perl语言——简单说明 一.简单说明 Perl语言全称:实用摘录与报表语言|病态折中式垃圾列表器.Perl名称并不是缩写词,而是个溯写字. Perl语言历史:Larry Wall(拉里·沃尔)20世 ...
- perl语言书籍教程推荐
互动出版网计算机频道.为您推荐关于perl语言的书籍教程.包括perl push.perl chomp以及perl python等perl语言内容. perl语言书籍一.<Perl语言编程 第四 ...
- 边看MHA源码边学Perl语言之一开篇
边看MHA源码边学Perl语言之一开篇 自我简介 先简单介绍一下自己,到目前为此我已经做了7年左右的JAVA和3年左右php开发与管理,做java时主要开发物流行业的相关软件,对台湾快递,国际快递,国 ...
- Perl语言入门
Perl 是 Practical Extraction and Report Language 的缩写,可翻译为 "实用报表提取语言". Perl语法基础: (1)Perl程序由声 ...
- c++11 语言级线程
c++11 语言级线程 线程的创建 用std::thread创建线程非常简单,只需要提供线程函数或函数对象即可,并且可以同时指定线程函数的参数. #define _CRT_SECURE_NO_WARN ...
- Perl语言入门: 斜线不是元字符,所以在不作为分隔符时不需要加上反斜线。
Perl语言入门: 斜线不是元字符,所以在不作为分隔符时不需要加上反斜线.
- [转帖]rename(Perl语言版本) 详解
rename(Perl语言版本) 详解 2019-03-19 22:51:23 wayne17 阅读数 464更多 分类专栏: Ubuntu之路 版权声明:本文为博主原创文章,遵循CC 4.0 B ...
- C语言实现线程池功能
1. 线程池基本原理 2. 线程池C语言实现 2.1 线程池的数据结构 #include <stdio.h> #include <pthread.h> #include < ...
随机推荐
- 配置Apache控制浏览器端的缓存的有效期
这个非常有用的优化,mod_expires可以减少20-30%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求.但要注意更新快的文件不要这么做.这个模块控制服 ...
- jQuery学习三——事件
代码如下: <!DOCTYPE html> <html> <head> <title>jquery事件</title> </head& ...
- Swift学习 (四)
5.枚举与结构体: 不必给枚举成员提供一个值.如果我们想要为枚举成员提供一个值(raw value),我们可以用字符串,字符,整型或浮点数类型. 1 2 3 4 5 6 7 enum CompassP ...
- laravel门面DB返回数组配置
在数据库配置文件中添加 'fetch' => PDO::FETCH_ASSOC, //但是这个配置好像是全局的,不能针对单个数据库连接进行配置 也可以在方法内使用php内置函数get_objec ...
- Eclipse Mars配置tomcat 7
进入Eclipse,点击"Window"-->"Preferences". 在出现的弹窗的左侧面板选择"Server"-->&q ...
- 第四章 INI配置——《跟我学Shiro》
转发地址:https://www.iteye.com/blog/jinnianshilongnian-2020820 第四章 INI配置——<跟我学Shiro> 博客分类: 跟我学Shir ...
- Python爬取链家二手房源信息
爬取链家网站二手房房源信息,第一次做,仅供参考,要用scrapy. import scrapy,pypinyin,requests import bs4 from ..items import L ...
- DSP VLIB实验
声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在dsp开发中,为了节省开发时间和难度,TI将一些成熟的算法封装为模块,供开发者使用.如果能充分利用这些 ...
- go项目部署到linxu
环境: 在mac上编译, 编译后上传到linux, 然后运行代码 go项目打包 一.直接部署到linux 1. 在mac上, 进入到项目目录, 执行以下命令, 进行编译: CGO_ENABLED=0 ...
- jqGrid取消所有选中
// 获取所有选中行id var jqGridRowid=$("#jqGrid").jqGrid("getGridParam","selarrrow& ...