Як я можу спати протягом мілісекунди в Perl?


76

Як я можу спати коротше секунди в Perl?


22
Це тому, що я вважаю, що ця назва насправді є більш корисною. Дозвольте мені спробувати аргументувати це. Те, що зробив BDF, повторило питання в заголовку, що не додає виразності. Коли я шукав відповідь в Інтернеті, я насправді шукав мілісекунди сну, а не сну "коротший за другий". Я вважаю, що ця версія має більше шансів потрапити під різні пошукові запити в Google, ніж версія BDF. Будь ласка, виправте мене, якщо я помиляюся.
ʊoʊ sɪks

Відповіді:


109

На сторінці Perldoc про сон :

Для затримок з детальнішою деталізацією, що перевищує одну секунду, модуль 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);

7
Застереження: хоча ви могли б наноспати (1), багато ОС мають певну мінімальну деталізацію; наприклад, я вважаю, що в Windows XP це 1 мс, тож ви все одно там би спали цілих 1000000 нс.
Пісквор вийшов з будівлі

14
На сторінці Time :: HiRes написано щось на кшталт "якщо вам потрібен nanosleep (), вам слід переглянути, чи найкращий інструмент для вашої роботи Perl".
Кріс Луц

4
Існує також Time :: HiRes :: sleep (0,3), який буде спати протягом 0,3 секунди.
Пітер Н Льюїс,


12

Від perlfaq8 :


Як я можу спати () або будильник () менше секунди?

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



4

Швидке гуглиння на "таймерах з високою роздільною здатністю perl" дало посилання на Time :: HiRes . Можливо, це те, що ти хочеш.


0
system "sleep 0.1";

робить трюк.


Це насправді спрацювало у мене (не елегантно, але для цілей налагодження, здається, працює).
PiotrK

насправді не perl, але корисний, якщо ви не хочете встановлювати Time :: HiRes, але вам потрібно трохи сну менше 1 секунди, але не забувайте , що нерест оболонки для цього вимагає часу, тому ви не можете розраховувати на точність !
Jimmy Koerting
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.