- 締切済み
Sleep関数の最大時間について
ブラウザ上のinputタグ内で指定された日時に、サーバー上で処理を実行させるプログラム(Perl)ができないか考えています。 (1)最大指定時間 指定した日時と、入力した日時の差分をとり、ミリ秒に変換してsleep関数で処理しようとおもいつきました。この場合、設定可能な最大日数などがお分かりになる方はいらっしゃいますか? (2) (1)以外でいい方法はありますか?ちなみにサーバーはUNIXでサーバー設定の知識は0の初心者です。 どなたかお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19840)
>指定した日時と、入力した日時の差分をとり、ミリ秒に変換してsleep関数で処理しようとおもいつきました。 Perlのsleepは「秒単位」です。 「引数に浮動小数点を与えられるように関数をオーバーライド」しない限り「1秒単位」です。 >この場合、設定可能な最大日数などがお分かりになる方はいらっしゃいますか? 「与える引数がオーバーフローしない限り、どんな値でも指定可」です。 しかし、引数の有効範囲は「実装によって異なる」ので、ある値を超えると「無限に待つ」と言う状態になるでしょう(引数なしのsleepと同じ処理をされてしまうと思われる) >(2) (1)以外でいい方法はありますか?ちなみにサーバーはUNIXでサーバー設定の知識は0の初心者です。 「sleepで指定の時間まで待つ」ってのは「常識あるプログラマなら絶対にやらない」です。 普通は「スケジュールをキューに放り込む」って言う処理と「定期的にキューを監視して実行すべきスケジュールがあるか」って言う処理を走らせて「現在時刻がスケジュールに書かれた時間を過ぎていたら、スケジュールを実行済みとして消去しつつ、そのスケジュール通りのコマンドを実行する」って言う書き方をする。 なので「Perlからはスケジュールをキューに放り込む」って言う処理だけをする。そして「処理は即座に終わらせる」のが絶対条件。 下手にPrelの中でsleepなんかしようものなら、WEBデーモンがあっという間にリソースを使い潰して、システムダウンする。 処理が即座に終了しない場合、ブラウザで「F5連打」されると、連打した分のプロセスが生成されるから「暫くの間、ずっと処理が終わらない」なんてのが居た日には、F5キーを40連打くらい押せば、簡単にサーバーをダウンさせる事が出来ちゃうぞ。 だから「行ったら帰ってこない」って処理は、絶対にやっちゃ駄目。
- cma3atgoo
- ベストアンサー率35% (32/90)
cronを使う。 設定ファイルは単なるテキストだったと思うので、 WEBアプリから書き換えてやればスケジューリングできるかも?
お礼
書き込みありがとうございます。 F5連打でサーバーダウン・・・なるほど(笑)。ご指摘ありがとうございます。 >普通は「スケジュールをキューに放り込む」って言う処理と「定期的にキューを監視して実行すべきスケジュールがあるか」って言う処理を走らせて「現在時刻がスケジュールに書かれた時間を過ぎていたら、スケジュールを実行済みとして消去しつつ、そのスケジュール通りのコマンドを実行する」って言う書き方をする。 > >なので「Perlからはスケジュールをキューに放り込む」って言う処理だけをする。そして「処理は即座に終わらせる」のが絶対条件。 すごい!こんなことができるんですね。 上記の処理の流れで進めるために、初心者でもわかりやすいサンプルとかありますか?「スケジュールをキューに放り込む」で検索してみたのですが、皆目見当もつきません。。