Chinaunix

标题: 今天收获非常大 [打印本页]

作者: 兰花仙子    时间: 2011-06-24 17:35
标题: 今天收获非常大
在虚拟机上运行这个脚本:
  1. open HD,"/etc/passwd" or die $!;
  2. while(1) {
  3.     my $x=<HD>;
  4.     print $x;
  5. }
复制代码
cpu立刻100%:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
28256 angel       20   0 17724 1824 1444 R  100  0.0   0:21.17 perl   


机器over了。
为了改正这个问题,我巧妙的加了一行:
  1. open HD,"/etc/passwd" or die $!;
  2. while(1) {
  3.     my $x=<HD>;
  4.     print $x;
  5.     sleep 1;  # 神来之笔
  6. }
复制代码
CPU立刻降下来了!
这真是高手的代码,有没有这行差别真大啊!
作者: Cu_fans    时间: 2011-06-24 17:40
学习了,前一个帖子貌似也说了这个问题。。

这是啥原理?这些人是怎么想出来的呢
作者: wtuter    时间: 2011-06-24 17:56
回复 1# 兰花仙子


    sleep 2呢
作者: 兰花仙子    时间: 2011-06-24 18:15
与flw英雄所见略同呀
作者: 首天    时间: 2011-06-24 18:55
佩服仙子……
曾经我shell中也使用过sleep ,还是sleep 5,记得当时是一个备份脚本,运行时其他用户根本不能正常使用系统,后来就在脚本中加了一行sleep 5,每备份一部分文件就执行sleep 5,就解决了
{:3_189:}
作者: DQP    时间: 2011-06-24 20:03
仙子小朋友你这样可不对啊  
作者: zhlong8    时间: 2011-06-24 20:40
仙子很坏,不过 flw 更坏
作者: x9x9    时间: 2011-06-24 22:34
说实话,我觉得两位版主好像有点“恶搞”的意思,如果是的话那还挺有意思~
如果是认真的,那我觉得真没意思~

这是原帖:http://bbs.chinaunix.net/thread-3556613-1-1.html
作者: 小perl    时间: 2011-06-25 00:04
没认出来解释一下为什么加上 sleep 1;这一句会使CPU占用率下降吗?
作者: perlcrack    时间: 2011-06-25 01:10
横正常 sleep 1降低速度了 1秒 一次 机器轻而易举能承受的  而当时while(1)的时候 机器肯定承受不住
作者: perlcrack    时间: 2011-06-25 01:11
横正常 sleep 1降低速度了 1秒 一次 机器轻而易举能承受的  而当时while(1)的时候 机器肯定承受不住
作者: 3P用户    时间: 2011-06-25 01:31
暂停进程,转让控制权。
作者: 2gua    时间: 2011-06-25 08:10
精华了啊。
作者: wxlfh    时间: 2011-06-25 10:02
本帖最后由 wxlfh 于 2011-06-25 10:03 编辑

读大文件居然用 while (1) {} 循环,太那个了啊。读大文件经典用法是
  1. while (<$fh>) {}
复制代码
两个版主都很幽默
作者: kk861123    时间: 2011-06-25 11:06
我也想起工作中使用的sleep one,在一个for循环中运行的是Genesis软件中的 `dbutil path jobs $job`命令来查找所有料号的路径名,部分运行OK但会出现断断续续出错并跳过此指令的情况。在此指令后添加 sleep 1后解决了。但不知原理为何?
作者: 首天    时间: 2011-06-25 16:48
我也想起工作中使用的sleep one,在一个for循环中运行的是Genesis软件中的 `dbutil path jobs $job`命令来查 ...
kk861123 发表于 2011-06-25 11:06


dbutil命令有时候是会出现错误,如果一个料号正处于check out状态,或者open状态时,就会出现错误提示。
作者: kengbianz    时间: 2011-06-26 02:18
原来如此呀
作者: godymoon    时间: 2011-06-26 16:26
{:3_182:}
sleep 一下就有这么大的差别?
作者: 兰花仙子    时间: 2011-06-26 16:38
sleep 一下就有这么大的差别?
godymoon 发表于 2011-06-26 16:26



    你睡你也能。。
作者: 极北之北    时间: 2011-06-26 22:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: Godbach    时间: 2011-06-27 09:20
回复 20# 兰花仙子
坐看高手们论 Perl。

BTW,仙子很幽默。
作者: gooker    时间: 2011-06-27 11:08
无语。。。
作者: xiaopan3322    时间: 2011-06-27 15:15
我想知道,这个原创到底是谁?
是兰花仙子版主,
还是这个人: http://bbs.chinaunix.net/redirec ... 13&pid=21137125
还是这个人啊: http://bbs.chinaunix.net/redirec ... 13&pid=21139947
作者: meilinxiaoxue    时间: 2011-06-27 23:45
看样子你cpu是单核?死循环是独裁行为。。加个sleep则是民主选举行为,共同享福.
作者: 行者on    时间: 2011-06-28 00:26
sleep就是干一会,歇一会
作者: mitmax    时间: 2011-06-28 09:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: robinho_nju    时间: 2011-06-28 10:06
这个让我想起了一个搞笑的sleep sort
  1. use threads;

  2. my @array = (2,4,3,5,1);

  3. print "start sort\n";

  4. sub main
  5. {
  6.         my @thr;
  7.         foreach my $i (@array)
  8.        {
  9.                 push @thr, threads->create(sub {f($i);})
  10.         }
  11.        map {$_->join;} @thr;
  12. }

  13. sub f
  14. {
  15.         my $i = shift;
  16.         sleep $i;
  17.         print $i."\n";
  18. }
  19. main();
复制代码

作者: rollingpig    时间: 2011-06-28 11:01
这……

给这个精华是为了褒奖兰花仙子的搞笑能力?
那应该发在非技术区啊?
作者: rsrmyzhljy    时间: 2011-06-29 16:20

作者: wttaurus    时间: 2011-06-29 16:28
新手学习中,谢谢!
作者: 醉卧水云间    时间: 2011-06-29 18:52
回复 1# 兰花仙子


    不如 sleep 0
作者: hitsubunnu    时间: 2011-06-30 09:23
人的反应时间是0.2秒
所以应该是   select(undef, undef, undef, 0.2)
作者: jack4010    时间: 2011-06-30 13:31
这个贴子给精华,版主真搞笑。
作者: Cu_fans    时间: 2011-07-06 12:01
楼上这就有点过份了,搞人生攻击。。。
作者: huatong_wg    时间: 2011-07-06 12:04
这不是我说的
作者: sellie    时间: 2011-07-06 12:17
哪个群. 号码.
作者: huatong_wg    时间: 2011-07-06 12:32
回复 39# sellie


    你要做什么?{:3_200:}
作者: sellie    时间: 2011-07-18 18:06
回复  sellie


    你要做什么?
huatong_wg 发表于 2011-07-06 12:32



    是Perl群的话就加入.
作者: pxczy    时间: 2011-07-19 17:55
传说中的火星帖吗
作者: dwm1235    时间: 2012-02-12 19:29
谁能讲一下原因啊
作者: ioerr    时间: 2012-02-13 11:41
学习)
作者: 半点闲    时间: 2012-03-27 19:25
小perl 发表于 2011-06-25 00:04
没认出来解释一下为什么加上 sleep 1;这一句会使CPU占用率下降吗?



while(1)=永远不会失败的循环,也就是俗称“死循环”。
在所有的计算机语言中,循环语句是很耗时的操作,特别是多层嵌套的循环或者“死循环”(应当在处理问题时避免使用这种算法),这时CPU计算时间完全被它给占用,系统中运行的其它程序将一点也得不到CPU计算的权力(它们的进程、线程将一直都处于等待状态),这就造成CPU资源占用100%的原因。
sleep语句的主要目地是暂停(挂起)一段时间再执行当前语句,在当前语句被挂起后CPU将从循环中解放出,而其它运行的程序将暂时的获得了执行的权力,CPU的占用率也就下降了。
但就,上述程序来说它执行的时间更长、更慢。
作者: 小perl    时间: 2012-03-27 21:41
回复 46# 半点闲


    讲的蛮好,哈哈,通俗易懂。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2