首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

请问perl多线程有关问题

2012-02-20 
请教perl多线程问题如何退出一个子线程,而使其他子线程继续运行,以下是我的程序,我设置了一个time,到了时

请教perl多线程问题
如何退出一个子线程,而使其他子线程继续运行,以下是我的程序,我设置了一个time,到了时间推出来,但是第一个子线程到时间后退出来,其他子线程都退出来了.

#!/usr/bin/perl
use threads;
use threads::shared;
use IPC::Open3;
use POSIX();

sub great{
print "$hello";
}
sub handle_deadloop()
{
print "dead\n";
if($platform eq "windows")
{
$job->kill; 
}
else
{
kill INT =>$child_pid;
}
}

$SIG{ALRM} = \&handle_deadloop;
$timeout=10;
sub run_one_case()
{
print "run_one_case$PID\n";
alarm($timeout);
while(1)
{
}
alarm(0);
}

$thread_count=5;
for my $i (1 .. $thread_count)
{
$cur_iter[$i] = 0;
$thread[$i] = threads->create(\&run_one_case);
print "$thread[$i]\n";
}

for my $i (1 .. $thread_count)
{
my $rVal = $thread[$i]->join();

if ($rVal ne "DONE")
{
#if ($case_iter > $#lines)
#{
#last;
#}
$thread[$i] = threads->create(\&run_one_case);
redo;
}
}



[解决办法]

 你参考下
----------------------------------
use Thread;
#导入Thread包
----------------------------------
$thread=Thread->new(\&aaa,'aaa','bbb');
#新建多线程对象变量$thread,第一个参数是以子程序方式的结构体,后面跟的
#都是调用前面的那个子程序结构的实际参数。
----------------------------------
$result=$thread->join();
#召回线程的返回。无参数,$result变量为返回值。注意:线程本身不能调用自
#己的join()方法。
----------------------------------
$thread->detach();
#使分线程与主线程分离。无返回值,无参数。注意:调用此步后就不能再在其他
#线程调用关于这个线程的join()方法了。
----------------------------------
@thread_list=$thread->list();
#返回正在运行的线程。无参数,返回值@thread_list为正在运行的线程的列表。
----------------------------------
$thread=Thread->self();
#返回当前线程本身。无参数,返回值为当前线程的对象变量。
----------------------------------
$tid=$thread->tid();
#返回多线程对象的tid值(附:tid为线程独有的id记号)。无参数,返回值为线程
#的tid值。
----------------------------------
lock($aaa);
#把进程中的某个变量锁住,以便某个线程不能改变其值。
----------------------------------
$thread=async{BLOCK};
#创造新线程的另一种方式。参数BLOCK为命令行格式,返回值为线程对象变量。
----------------------------------
=============================================================================================================
#实验:因为至今还不能很好地‘凌驾’这种‘技术’,因此不能提供良好的实验代码给大
#家,望大家见谅。
#!usr/bin/perl -w
use IO::Socket; #导入IO::Socket包
use Thread; #导入Thread多线程处理包
$sock=IO::Socket::INET->new(Listen=>10, #新建一个TCP、端口为5354、有10个监听队列的SOCKET
LocalPort=>5354,
Proto=>'tcp');
while(1){ #进入典型的服务器循环体
next unless $client=$sock->accept; #ACCEPT
Thread->new(\&IandO,$client); #成功ACCEPT后,进入一个线程,线程为I/O会话部分
$client->close; #结束客户端的会话
}
$sock->close; #最后结束服务端SOCKET
exit 1; #退出程序

sub IandO{ #线程核心子程序
my $handle=shift; #将线程调用的参数吸入到变量$handle
Thread->self->detach; #分离线程
print $handle "HI!\n"; #I/O操作


return; #返回主线程
}
#记住:服务端所谓‘多线程’中的线程其实是指整个SOCKET中的I/O会话部分。
#注意线程核心子进程基本步骤:截取调用参数->分离主线程->I/O
=============================================================================================================
注意:在PERL5.X版下只有WIN32与部分*NIX支持多线程,MACPERL与部分*NIX还是不支持的。
 
 
  
 
 
--------------------------------------------
 
2
 用perl实现多线程(转) 
  


use strict; 
use English '-no_match_vars'; 
use Errno qw(EAGAIN); 
use threads; 
use threads::shared; 
my $items = 20; #需要处理的任务数 
my $maxchild = 65; #最多线程数(1-65),perl最多允许64个子线程,加上主线程因此最多65个线程 
my $pid; 
my $forks: shared = 1; #当前线程数 
print "startn"; 
my $item: shared = 0; #当前处理任务序号,起始序号为0 
my $myid = 1; #当前线程序号 
my $main_pid = $PID; 
sub subprocess; 
#最多$maxchild个线程完成$items项任务 
while ($item<$items) { 
FORK: { 
#select undef,undef,undef,0.1; 
if (($forks<$maxchild) && ($PID == $main_pid)) { #必须只允许主线程产生子线程 
 if ($pid = fork) { #主线程处理 
$| = 1; 
$forks++; 
$myid++; 
print "Starting Sub_Process:($pid/$PID)n"; 
}elsif (defined $pid) { #子线程处理 
$| = 1; 
last unless (subprocess); 
}elsif ($! == EAGAIN) { #子线程未创建成功 
print "$!$forksn"; 
# EAGAIN is the supposedly recoverable fork error 
sleep 5; 
redo FORK; 
}else { #不能创建子线程 
# weird fork error 
die "Can't fork: $!n"; 

}else { #所有线程处理 
last unless (subprocess); 




sub subprocess { 
#由于$item是共享的且每个线程都能对其进行修改,因此为了保证当前线程任务序号的正确,必须将$item转入局部变量存储 
my $sid; #存储线程当前处理任务序号。 

lock($item); 
$sid = $item; 
$item++ if ($item < $items); 

if ($sid < $items) { #任务处理 
print "Child process($PID/$myid) start :$sid/$forksn"; 
print "$sidn"; 
sleep 1; 
print "Child process($PID/$myid) end :$sid/$forksn"; 
return 1; 
}elsif ($main_pid == $PID) { #主线程结束 
wait; #结束前等待所有子线程结束 
print "Main process $$/$myid endn"; 
exit 1; 
}else { #子线程结束 
print "Child process($PID/$myid) exit :$sid/$forksn"; 
exit 1; 

}
 
 
 
 
 
 

热点排行