设为首页 收藏本站
查看: 719|回复: 0

[经验分享] Perl 多进程进度条

[复制链接]

尚未签到

发表于 2015-12-28 10:09:00 | 显示全部楼层 |阅读模式
  具体的请根据个人需要修改代码。



   #!/usr/local/bin/perl5
use warnings;
use strict;
use Fcntl;
use Term::Cap;
use Parallel::ForkManager;
#==============================
# for terminal control
#==============================
my $termios = new POSIX::Termios;
my $terminal = Term::Cap->Tgetent ({ TERM => undef, OSPEED => $termios->getospeed });
$terminal->Trequire(qw(cm sc rc)); #check if terminal support these capabilities
my $c = `clear`;
print $c;
#==============================
# for fifo
#==============================
my $fpath = "myfifo";
unless (-p $fpath) {
if (-e _) {
die "$fpath is something unknow\n";
}
else {
require POSIX;
POSIX::mkfifo($fpath, 0666) or die "can not mknod $fpath: $!";
print "$0: created $fpath as a named pipe\n";
}
}
else {
print "$0: named pipe $fpath exists\n";
}

#==============================
# for parallel processes
#==============================
my @names;
push @names, "p$_" foreach 0..5;
my $childs;
$childs->{$_} = {total=>1, processed=>0, name => $names[$_]} foreach(0.. $#names);
my $remain_child_process = scalar @names;
$SIG{PIPE} = sub {
-- $remain_child_process;
print STDERR "pipe broken\n";
};

#==============================
# main program
#==============================
my $now = time;
my $pm =  new Parallel::ForkManager(scalar @names);
foreach my $child ( 0 .. $#names ) {
my $pid = $pm->start($names[$child]) and next;
#print "This is $names[$child], Child number $child: $\n";
work($child);
$pm->finish($child); # pass an exit code to finish
    }
print "Waiting for Children...\n";
show_progress();
$pm->wait_all_children;
$now = time - $now;
printf("\n\nTotal run time: %02d:%02d:%02d\n\n", int($now / 3600), int(($now % 3600) / 60), int($now % 60));
print "Everybody done!\n";

#==============================
# real work of child process
#==============================
sub work {
my $child = shift;
my $total = int(rand(20)) + 5;
foreach (1..$total) {
select(undef, undef, undef, 0.2);
sysopen (FIFO_W, $fpath, O_WRONLY) or die "can't write $fpath: $!";
print FIFO_W "child:$child,processed:$_,total:$total\n";
close FIFO_W;
}
sysopen (FIFO_W, $fpath, O_WRONLY) or die "can't write $fpath: $!";
print FIFO_W "$child over\n";
close FIFO_W;
}

#==================================================
# receive progress data from child and display them
#==================================================
sub show_progress {
while ($remain_child_process) {
die "Pipe file disappeared" unless -p $fpath;
sysopen (FIFO_R, $fpath, O_RDONLY) or die "can't read $fpath: $!";
while(my $m = <FIFO_R>) {
if ($m =~ m/over/) {
-- $remain_child_process;
}
else {
#print $m;
my ($child, $processed, $total) = $m =~ m/child:(\w+),processed:(\d+),total:(\d+)/;
$childs->{$child}->{processed} = $processed;
$childs->{$child}->{total} = $total;
proc_bar($childs);
}
}
close FIFO_R;
}
$terminal->Tgoto('cm', 0, 5+2*@names, *STDOUT); #move cursor to bottom of screen
    }
#=====================================
# indicate the progress of comparation
#=====================================
sub proc_bar{
my $childs = shift;
local $| = 1;
$terminal->Tgoto('sc', undef, undef, *STDOUT); #save cursor
for my $c (sort keys %$childs) {
my $i = $childs->{$c}->{processed};
my $n = $childs->{$c}->{total};
my $name = $childs->{$c}->{name};
print "\r\033[36mchild: $c($name) [\033[33m".("#" x int(($i/$n)*50)).(" " x (50 - int(($i/$n)*50)))."\033[36m]";
printf("%2.1f%%\033[0m\n",$i/$n*100);
}
$terminal->Tgoto('rc', undef, undef, *STDOUT); #restore cursor
local $| = 0;
}
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-157301-1-1.html 上篇帖子: posix和perl标准的正则表达式区别 下篇帖子: Solaris10 x64安装64bit perl
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表