Как мне спать на миллисекунду в Perl?

65

Как спать в Perl на секунду меньше?

  • 22
    Это потому, что я считаю, что это название на самом деле более полезно. Позвольте мне попытаться аргументировать это. BDF сделал дубликат вопроса в названии, который не добавляет выразительности. Когда я искал в Интернете ответ, я фактически искал миллисекундный сон, а не сон «короче второго». Я говорю, что у этой версии больше шансов попасть через другие поиски в Google, чем в BDF. Пожалуйста, поправьте меня, если я ошибаюсь.
Теги:
sleep

6 ответов

101
Лучший ответ

На странице Perldoc на 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);
  • 6
    Предостережение: хотя вы можете наноспать (1), многие ОС имеют некоторую минимальную степень детализации; например, я полагаю, что в Windows XP это 1 мс, так что вы все равно спите там целых 1000000 нс.
  • 12
    На странице Time :: HiRes говорится что-то вроде: «Если вам нужен nanosleep (), вам следует пересмотреть, является ли Perl лучшим инструментом для вашей работы».
Показать ещё 1 комментарий
31

Время:: HiRes:

  use Time::HiRes;
  Time::HiRes::sleep(0.1); #.1 seconds
  Time::HiRes::usleep(1); # 1 microsecond.

http://perldoc.perl.org/Time/HiRes.html

  • 0
    паршивая 34 секунды :)
12

От perlfaq8:


Как я могу спать() или будильник() в течение секунды?

Если вы хотите более тонкую детализацию, чем за 1 секунду, что обеспечивает функция sleep(), самый простой способ - использовать функцию select(), как описано в select perlfunc. Попробуйте модули Time:: HiRes и BSD:: Itimer (доступные из CPAN и начиная с Perl 5.8 Time:: HiRes является частью стандартного дистрибутива).

6

Используйте Время:: HiRes.

4

Быстрый поиск по "perl высоким таймерам" дал ссылку на Time:: HiRes. Возможно, это то, что вы хотите.

-4
system "sleep 0.1";

делает трюк.

  • 0
    Это на самом деле работает для меня (не элегантно, но для целей отладки, кажется, работает).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню