免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3952 | 回复: 10
打印 上一主题 下一主题

perl 多进程如何控制输出 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-29 09:57 |只看该作者 |倒序浏览
本帖最后由 qiuzhimajia 于 2010-07-29 11:52 编辑

我写了一个多进程的程序,但是每个进程都会往终端输出,运行时输出杂乱无章,敢问各位如何控制输出,谢谢
如下代码:
  1. my @rno1 = (100..109);
  2. my @rno2 = (110..119);
  3. my @rno3 = (120..129);
  4. my @rno4 = (130..139);
  5. my @rno5 = (140..149);
  6. my @rno6 = (150..159);
  7. my @rno7 = (160..169);
  8. my @rno8 = (170..179);

  9. my %rno = (
  10.         no1 => "@rno1",
  11.         no2 => "@rno2",
  12.         no3 => "@rno3",
  13.         no4 => "@rno4",
  14.         no5 => "@rno5",
  15.         no6 => "@rno6",
  16.         no7 => "@rno7",
  17.         no8 => "@rno8",
  18. );

  19. while ( my ($key,$value) = each(%rno)) {
  20.         my $child=fork();
  21.         if ($child) {
  22.                 print "$child start!\n";
  23.         }else {
  24.                 &printmy( $value );
  25.                 print "children done!";
  26.                 exit;
  27.         }

  28. }

  29. sub printmy(){
  30.         print "@_\n";
  31. }
复制代码
各自的输出都会交叉的,请教一个方案可以避开混乱输出

论坛徽章:
0
2 [报告]
发表于 2010-07-29 10:31 |只看该作者
用一个进程来集中输出。
这个需求比较奇怪吧。。
就算写日志,也只需表明进程ID、时间等信息就清楚了。

论坛徽章:
0
3 [报告]
发表于 2010-07-29 10:47 |只看该作者
能否给个例子看下

论坛徽章:
0
4 [报告]
发表于 2010-07-29 11:17 |只看该作者
貌似perl里多个进程同时print 不同的内容是不会出现交叉的内容的,
比如
进程1 print "aaa bbb ccc\n";
进程2 print "eee ffff ggg\n";

他们是不会出现错乱的, 只是出现的顺序没办法确定而已

论坛徽章:
0
5 [报告]
发表于 2010-07-29 13:35 |只看该作者
本帖最后由 qiuzhimajia 于 2010-07-29 13:45 编辑
貌似perl里多个进程同时print 不同的内容是不会出现交叉的内容的,
比如
进程1 print "aaa bbb ccc\n";
...
dajun 发表于 2010-07-29 11:17



   试了一下,好像不是

论坛徽章:
0
6 [报告]
发表于 2010-07-29 13:43 |只看该作者
看了你的代码, 可以这样做, 但是基本上失去了多进程的意义:


  1. my @rno1 = (100..109);
  2. my @rno2 = (110..119);
  3. my @rno3 = (120..129);
  4. my @rno4 = (130..139);
  5. my @rno5 = (140..149);
  6. my @rno6 = (150..159);
  7. my @rno7 = (160..169);
  8. my @rno8 = (170..179);

  9. my %rno = (
  10.     no1 => "@rno1",
  11.     no2 => "@rno2",
  12.     no3 => "@rno3",
  13.     no4 => "@rno4",
  14.     no5 => "@rno5",
  15.     no6 => "@rno6",
  16.     no7 => "@rno7",
  17.     no8 => "@rno8",
  18.     );
  19. my ($key, $value);
  20. foreach $key ( sort { $a cmp $b } keys %rno ) {
  21.     $value = $rno{$key};
  22.     my $child=fork();
  23.     if ($child) {
  24.         print "$child start!\n";
  25.         wait;
  26.     }else {
  27.         &printmy( $value );
  28.         print "children done!\n";
  29.         exit;
  30.     }

  31. }

  32. sub printmy(){
  33.     print "@_\n";
  34. }

复制代码

论坛徽章:
0
7 [报告]
发表于 2010-07-29 13:46 |只看该作者
本帖最后由 qiuzhimajia 于 2010-07-29 13:49 编辑
看了你的代码, 可以这样做, 但是基本上失去了多进程的意义:
dajun 发表于 2010-07-29 13:43



    为什么,我写的只不过是一个简单的例子(基本结构是这样的)

论坛徽章:
0
8 [报告]
发表于 2010-07-29 13:54 |只看该作者
我修改的是最简单的让结果有序的按照100-170来打印的办法,

因为在父进程里加了wait;
也就是让子进程一个一个按顺序执行, 和单进程没什么差别,所以失去了多进程的意义,

彻底解决的办法就是用IPC, 你自己研究研究吧

论坛徽章:
0
9 [报告]
发表于 2010-07-29 16:10 |只看该作者
本帖最后由 wind_ch 于 2010-07-29 16:12 编辑

要么用仙子的建议,像日志那样标识清楚,要么就输出到不同的文件吧。

论坛徽章:
0
10 [报告]
发表于 2010-07-30 09:15 |只看该作者
要么用仙子的建议,像日志那样标识清楚,要么就输出到不同的文件吧。
wind_ch 发表于 2010-07-29 16:10



    不知道perl 有没有重定向输出的函数或是更改输出缓冲区的函数,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP