以前为了方便自己(当然也是为了偷懒^_^)使用perl写了一个脚本来抓取网页,并进行分析以获取我想要的信息,随着要抓取的网页越来越多,这个脚本的执行效率明显变慢,于是想到了使用多线程来节省在抓取网页上花费的时间(这个是耗时最多的过程占了90%的时间)
由于对perl的使用时间不是很长, 使用的次数也不是很多,因此一直不知道perl支持多线程,更不用说用了.
不过我遇到问题习惯在网上搜一番,发现大部分都是使用perl的多线程来写ftp下载,或是密码的破解(穷举法). 对perl的多线程的使用的讲解还不是很明白
其实使用perl的多线程很简单:
use Thread;
#use threads::shared;
my @threads;
open(MHO,$mhofile);
my @mholist=<MHO>;
foreach my $mho (@mholist) {
next unless defined $mho;
print "start one thread";
$threads[$tempcount]=Thread->new(\&start_thread,$mho);
$tempcount++;
}
foreach my $thread (@threads) {
$thread->join();
}
sub start_thread{
my ($infomho)=@_;
print "in thread $infomho";
sleep 20;
}
以上就是一个多线程的例子,创建线程的方法有好几种 (比如create(...))启动了多干个线程后,我们这里一定要使用变量保存thread的id。因为,创建一个thread以后要用join取得该thread的返回值,然后系统才会对thread进行清理,否则所有thread的信息都会保留下来,当然越积越多了。对返回值不关心的时候要用detach显式剥离该thread。所以,在最后我们要等待这些线程的完全退出:
foreach my $thread (@threads) {
$thread->join();
}
否则,threads库会在最后打印如下信息:
A thread exited while 2 threads were running.
至于多线程的其他方法的使用还在学习中^_^.
例子二:
http://www.cnblogs.com/joechen/archive/2009/04/27/1444569.html
Perl中的多线程的实现一般有两种办法,而老版本的办法实际上是一种多进程的办法。
一 Thread->New
该办法是传统的老办法,它与folk很类似,新建一个进程时,会把当前内存空间的所有变量都复制一份传到新的进程里面。已实现共享数据。而随着技术的发展,本文不针对该方法做深入研究。
二 IThread
这种方法是通过新建一个新的perl interpreter。默认情况下,所有的数据和变量是不被线程共享的。如果想共享一个变量,需通过threads::shared来实现。在使用此方法的时候,需要注意以下三点:
- 变量默认是不在线程中共享的。
- 通过"use threads"引用命名空间,不能通过 , do, 或者 require。
- 如果有变量需要共享,必须引用"threads::shared"。 并在定义变量的时候如下:
my $var1 : shared = "value";
以下是一个简单的使用perl 多线程的例子。
#!/usr/local/bin/perl
use threads;
@domain = ("tom.com", "chinadns.com", "163.com", "aol.com");
for ($i=0;$i<4;$i++)
{
print $i.'.'.$domain[$i].' ';
}
print "\n";
my $thr0 = threads->new(\&checkwhois, '0', $domain[0]);
my $thr1 = threads->new(\&checkwhois, '1', $domain[1]);
my $thr2 = threads->new(\&checkwhois, '2', $domain[2]);
my $thr3 = threads->new(\&checkwhois, '3', $domain[3]);
sub checkwhois()
{
my ($l,$r)=@_;
my $i=0;
while($i<1000000)
{
$i*$i;
$i++;
}
print "done --$l\t\n";
print $l.$r." query successful! \n";
}
$thr0->join;
$thr1->join;
$thr2->join;
$thr3->join;
这个简单的perl主要是新建了4个子线程去做不同的事情,然后调用join方法等待他们执行完成并让线程自动回收
但有时,还是需要结合folk 做一些复杂的工作,下面是关于这个的例外一个demo。看原文连接
例子三:
perl多线程编程给我的总体感觉有点像
Linux C POSIX多线程编程。
perl多线程编程使用起来非常方便,但要深入掌握还是要下点功夫的。这里有一个简单的例子:
#!/bin/perl
use strict;
use threads;
use Cwd;
use POSIX qw(strftime);
################################################################################
# 函数名: count
# 函数描述: 数数
# 输入: name 随意输入一个名字
# 输出: 无
# 调用:
# 被调用:
# 返回:
################################################################################
sub count
{
my ($name) = @_;
my $current_time = strftime "%Y-%m-%d %H:%M:%S", localtime;
for ($i = 0; $i <= 10000; $i++)
{
print "$current_time $name $i";
}
}
创建第一批线程
my $thread_1_01 = threads->create('count', Thread_1);
my $thread_1_02 = threads->create('count', Thread_2);
my $thread_1_03 = threads->create('count', Thread_3);
my $thread_1_04 = threads->create('count', Thread_4);
# 等待第一批线程结束完成
$thread_1_01->join();
$thread_1_02->join();
$thread_1_03->join();
$thread_1_04->join();
# 创建第二批线程
my $thread_2_01 = threads->create('count', Thread_5);
my $thread_2_02 = threads->create('count', Thread_6);
my $thread_2_03 = threads->create('count', Thread_7);
# 等待第二批线程结束完成
$thread_2_01->join();
$thread_2_02->join();
$thread_2_03->join();
相关推荐
### Perl多线程详解 #### 一、进程与线程的概念 在计算机科学领域中,进程(Process)和线程(Thread)是两个基本概念。进程是一个正在执行的任务的抽象,每个进程都有自己的独立内存空间,因此它们之间不共享资源。一...
Perl同样支持多线程编程,这使得它在处理大规模数据处理、网络爬虫和实时系统等任务时更具优势。下面我们将深入探讨Perl的多线程特性,以及如何有效地利用这些特性进行编程。 一、Perl中的线程概念 Perl中的线程...
Perl 多线程实现详解 Perl 是一种功能强大的高级编程语言,它提供了多种方法来实现多线程编程。多线程编程是指在同一个进程中同时运行多个线程,以提高程序的执行效率和响应速度。Perl 语言提供了多种多线程实现...
Perl语言实现多线程编程是Perl多线程模块(threads)的一项功能,它允许程序员在Perl程序中创建和管理线程。从给出的文件内容中,可以提取以下知识点: 1. Perl的线程创建和使用:在Perl中,可以使用threads模块来...
从5.6版本开始Perl已经开始部分的支持多线程,而在5.8版本中进一步的得到了完善,不过目前国内对于Perl多线程编程方面的资料相对较少,由于工作上的原因可能会使用到多线程方面的东西所以写了一个测试程序,运行以后...
5. **面向对象编程**:理解Perl中的类、对象、继承和封装,以及如何实现多态性,为编写复杂程序打下基础。 6. **错误处理和调试**:学习如何使用警告和错误处理机制,以及调试技巧,以确保代码的健壮性。 7. **...
这个工具充分利用了Perl的多线程特性,支持多部分上传,使得大文件备份到Amazon Glacier的过程更为快速和稳定。Amazon Glacier是一种经济型的云存储服务,适用于长期归档和备份数据。 Amazon Glacier服务的核心特性...
Perl中的线程是并发编程的重要概念,它允许在同一程序中同时执行多个任务。在Perl中,线程的使用可以帮助提高程序的效率,尤其是在处理大量并发操作时。以下是对Perl线程的详细解释: 首先,Perl程序的执行顺序通常...
这本书涵盖了更高级的主题,例如面向对象编程、异常处理、多线程、数据库交互、网络编程以及Perl与外部系统(如命令行工具和操作系统)的接口。此外,它还可能深入讨论Perl的内核机制,如编译器和解释器的工作原理,...
state关键字则支持在函数或块级别声明静态变量,这在多线程编程中特别有用。此外,given/when语句提供了类似switch-case的结构,使得条件判断更为直观。 Strawberry Perl还包括了CPAN(Comprehensive Perl Archive ...
【FTP扫描程序】是一种自动化工具,它通过多线程技术对指定的FTP服务器进行快速、高效地枚举和检查。这种程序通常用于安全审计、漏洞检测或者网络管理,以识别可访问的FTP服务、开放的端口、匿名登录权限、潜在的弱...
### Intel多线程程序开发指南2:内存管理与编程工具 #### 概述 《Intel多线程程序开发指南》第二部分重点介绍了在共享存储模型下进行高效多线程程序设计时所需的内存管理和编程工具方面的知识。这份由Intel官方...
Perl线程池是一种编程概念,它在Perl编程语言中实现了一种优化的多线程处理模式。线程池,也称为工作线程池,是一种管理并发执行任务的机制,通过预先创建一组线程并保持它们待命状态,来提高系统的响应速度和效率。...
VB 下 FTP 多线程技术的实现还包括一些其他方面的技术,如 bat 文件的基本应用、unix shell 脚本、awk、basic、perl 等脚本语言。这些技术都可以和 VB 下 FTP 多线程技术的实现结合使用,以实现更好的 FTP 文件传输...
- **多线程编程**:Perl还支持多线程编程,这对于需要处理并发任务的应用程序非常有用。 - **国际化支持**:Perl内置了国际化功能,可以方便地处理多种语言和字符集。 - **与其他语言的集成**:Perl可以与C语言等...
Advanced.Perl.Programming.1st.Edition.pdf:提供了 Perl 语言的高级编程技术,包括对象编程、网络编程和多线程编程等。 Advanced.Perl.Programming.2nd.Edition.chm:更新了 Perl 语言的高级编程技术,包括最新...
书中涵盖了Perl的高级特性,如正则表达式、模块化编程、对象导向编程、网络编程、数据库交互以及并发和多线程等。通过阅读这本书,读者能够了解到如何利用Perl处理复杂的编程问题,提升代码效率和可维护性。 1. ...
- **多线程(threads)**:Perl支持多线程编程,可以处理多个网络连接并发请求。 - **异步I/O(IO::Async)**:提供非阻塞I/O机制,实现高效的并发网络编程。 7. **安全和错误处理**: - **SSL/TLS**:Perl可以...