如何在Perl中让程序休眠一毫秒?

85

我如何在Perl中睡眠少于一秒钟?


22
我认为这个标题更有帮助,让我来说一下我的观点。B.D.F.所做的是在标题中重复了问题,这并没有增加表达能力。当我在网上寻找答案时,我实际上是在寻找毫秒级的睡眠,而不是“少于一秒”的睡眠。我认为这个版本比B.D.F的版本更容易通过不同的谷歌搜索被找到。如果我错了,请纠正我。 - ˈoʊ sɪks
7个回答

120

从Perl文档页面中的sleep函数得知:

对于需要精度高于一秒的延迟,可以使用Time::HiRes模块(从CPAN获得,并且在Perl 5.8中成为标准分发组件)提供的usleep()。

事实上,它提供了usleep()(以微秒为单位睡眠)和nanosleep()(以纳秒为单位睡眠)。您可能想使用usleep(),这应该让您更容易地处理数字。1毫秒休眠(使用每个函数):

use strict;
use warnings;

use Time::HiRes qw(usleep nanosleep);

# 1 millisecond == 1000 microseconds
usleep(1000);
# 1 microsecond == 1000 nanoseconds
nanosleep(1000000);

如果您不想要(或不能)加载模块来执行此操作,则您可能还可以使用内置的select()函数:

# Sleep for 250 milliseconds
select(undef, undef, undef, 0.25);

8
注意:虽然你可以使用nanosleep(1),但许多操作系统都有一些最小时间单位;例如,我认为在Windows XP中它是1毫秒,因此在那里你仍然要睡眠整个1000000纳秒。 - Piskvor left the building
14
Time::HiRes的页面上大致说:“如果你需要nanosleep(),应重新考虑Perl是否是最适合你工作的工具。” - Chris Lutz
7
还有 Time::HiRes::sleep(0.3) 可以让程序休眠 0.3 秒。 - Peter N Lewis

39

13

来自 perlfaq8:


如何让 sleep() 或 alarm() 小于一秒?

如果您需要比 sleep() 函数提供的1秒更细的粒度,则最简单的方法是使用 select() 函数,具体请参阅perlfunc中的select文档。可以尝试使用 Time::HiRes 和 BSD::Itimer 模块(可从CPAN获取,从Perl 5.8开始,Time::HiRes已成为标准发行版的一部分)。


7

5

在Google上快速搜索"perl高分辨率计时器",可以得到指向Time::HiRes的参考资料。也许这正是您需要的。


2
system "sleep 0.1";

做到了。

它对我来说确实起作用了(虽然不够优雅,但似乎可以用于调试目的)。 - PiotrK
1
虽然不是 Perl,但如果您不想安装 Time::HiRes 但需要一些小于1秒的睡眠时间,这很有帮助。但请记住,为此生成一个 shell 本身也需要时间,因此您不能指望准确性! - Jimmy Koerting
适用于安装了现代GNU sleep实用程序的Linux和许多其他系统,但在BSD、MacOS、busybox-Linux等系统上可能无法正常运行。(实际上,它可能会在BSD/MacOS上运行,这取决于分发版中是否包含了相应的sleep命令) - undefined

0
对于在没有GNU的sleep命令的系统上的命令行界面上的一行命令:
perl -MTime::HiRes=usleep -e 'usleep(1000000);';

睡眠1秒。您可以通过在命令前加上time来验证这一点。因此,要将微秒转换为毫秒,将您预期的毫秒乘以1000。
~ otheus$ time perl -MTime::HiRes=usleep -e 'usleep(1000000);';

real  0m1.032s
user  0m0.011s
sys   0m0.010s
~ otheus$ time perl -MTime::HiRes=usleep -e 'usleep(500000);';

real  0m0.547s
user  0m0.010s
sys   0m0.026s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接