如何讓Perl每20秒運行一次代碼?如何讓Perl每20秒運行一次代碼?
回答
for (;;) {
my $start = time;
# your code;
if ((my $remaining = 20 - (time - $start)) > 0) {
sleep $remaining;
}
}
Upvote:不會受到漂移的影響。 – daxim 2010-09-20 08:48:15
@daxim如果'#你的代碼'部分花費了超過20秒的時間,它會發生漂移。爲了防止漂移,它需要'sleep(($ interval - (time - $ start))%$ interval)',其中'$ interval'是二十。 – 2010-09-20 13:24:12
@daxim當然,每20分鐘可能有一秒鐘的漂移。 – 2010-09-20 15:08:12
雖然sleep
功能將用於某些應用工作,如果你正在試圖做「每20秒,永遠」,那麼你最好使用外部工具像cron
。
除了已經提到的可能的漂移問題之外,如果您的sleep
腳本退出(預期或以其他方式),那麼它在下一個20秒時間內不會再運行。
@Blrfl是正確的,我覺得好笑。也就是說,這很容易克服。
* * * * * /path/to/script.pl
* * * * * sleep 20 && /path/to/script.pl
* * * * * sleep 40 && /path/to/script.pl
你也可以採取將在腳本中的有限數量的睡眠循環,並利用cron來運行它每隔X分鐘,覆蓋腳本死亡的情況下的混合方法。任何比20秒更頻繁的事情,我肯定會採取這種方法。
POSIX'cron'不會執行分鐘分辨率。 – Blrfl 2010-09-20 17:00:19
建立一個SIGALRM處理程序,並給自己發送信號,每隔20秒alarm
(見perldoc -f alarm):
$SIG{ALRM} = sub {
# set up the next signal for 20 seconds from now
alarm 20;
# do whatever needs to be done
# ...
};
這將經歷時間漂移,因爲每個信號可以被直到第二延遲;如果這很重要,請設置一個cron作業。此外,如果您的其他代碼需要超過20秒才能運行,則會發生更多漂移,因爲只有一個計時器可以一次計數。你可以通過產生線程來解決這個問題,但是現在我已經回到了一個簡單的cron解決方案。
選擇合適的解決方案取決於您需要定期執行哪種任務,而您沒有指定。
#!/usr/bin/perl
use strict; use warnings;
use Schedule::ByClock;
my $scheduler = Schedule::ByClock->new(0, 20, 40);
while (defined(my $r = $scheduler->get_control_on_second)) {
printf "%02d\n", $r;
}
所有的告誡也有人指出仍然適用,但我認爲該模塊整齊。
@BugShotGG您還需要一臺運行Perl的計算機。 – 2017-07-19 17:11:30
圍棋與..
while() {
sleep 20;
#Code here
}
#!/usr/bin/perl -w
use strict;
# heartbeat
$SIG{ALRM} = sub {
# set up the next signal for 20 second from now
alarm(20);
printf "<heartbeat/>\n";
};
alarm(20); # start timer
my $i = 0;
while(1) {
$i++;
printf "loop" . $i . "\n";
sleep 2;
}
alarm(0);
printf "done!\n";
輸出:
loop1
loop2
loop3
loop4
loop5
loop6
loop7
loop8
loop9
loop10
<heartbeat/>
loop11
loop12
loop13
loop14
loop15
loop16
loop17
loop18
loop19
loop20
<heartbeat/>
可能有些註釋會受到歡迎。最好的祝福 – YakovL 2017-09-05 13:32:50
- 1. 每x秒運行一次代碼
- 2. 如何在第二秒每秒運行一次代碼?
- 3. 運行代碼每秒只有60次
- 4. 如何在Heroku上每秒運行一次代碼?
- 5. 如何讓代碼只運行一次
- 6. 每20秒執行一次php函數
- 7. 如何讓一個Ruby腳本每秒運行一次?
- 8. 如何在Android中運行一些代碼20秒
- 9. 如何讓代碼每30分鐘運行一次?
- 10. 只能每X秒運行一次內部代碼的代理
- 11. 如何讓我的函數在Python中每秒運行一次?
- 12. 如何讓功能每30秒運行一次?
- 13. 運行時1004錯誤,每秒執行一次代碼
- 14. Python每20秒運行一次cron作業
- 15. 每n秒運行一段代碼
- 16. 每T秒運行一次MATLAB的Java代碼
- 17. 在VSTS中如何每5秒運行20秒webtest
- 18. 每20秒運行一次,而不是指定的延遲運行
- 19. 每20秒啓動一次動畫
- 20. 在Java中,如何每X秒執行一次代碼?
- 21. 每10秒執行一次代碼,但在0秒後啓動
- 22. 每x分鐘運行一次代碼
- 23. C#每30天運行一次代碼
- 24. 如何每兩分鐘運行一次每秒cron作業
- 25. 如何讓代碼每15分鐘連續執行一次?
- 26. 每秒用rAF.js運行JavaScript代碼?
- 27. PHP:運行PHP代碼每10秒
- 28. 每秒運行一次活動
- 29. 每10秒運行一次node.js腳本
- 30. Cron作業 - 每5秒運行一次
以人向下投票這個問題,停下來想想了幾分鐘。像「睡眠20」這樣的簡單答案只是部分解決方案。 – 2010-09-20 15:05:54
@Chas。問題是這個問題沒有明確指出(參見Ether/Blrfl關於答案的評論)。因此,即使所要求的不是,問題也不好。 – DVK 2010-09-20 17:32:43
@DVK是的,會出現各種各樣的複雜情況(代碼應該每隔20秒重複一次,沒有重疊,在二十秒邊界上,在一分鐘的第0,第20和第40秒等等)執行。這些都是對所需問題的改進,但是反對票不會得到改進,特別是沒有人評論爲什麼它不是一個很好的問題。 – 2010-09-20 19:35:16