0

Coro、Coro::LWP、LWP::UserAgent を使用したスクリプトがあります。一連のリクエストを作成し、Coro の非同期 {} で実行します。次に、それらの結果を使用してファイルに保存します。スクリプトが数時間、場合によっては数分間実行された後、フリーズします。strace ルックアップを作成して、それが何をしているかを確認しました。たくさんのアクションがありますが、結果を保存した後、フリーズする前にこのアクションがありました:

rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({1211417888, 0}, {1211354002, 168413065}) = ? ERESTART_RESTARTBLOCK (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
restart_syscall(<... resuming interrupted call ...>) = ? ERESTART_RESTARTBLOCK (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
restart_syscall(<... resuming interrupted call ...>

フリーズを理解するのに何か奇妙なことはありますか?

PerlMonks でクロスポストされました。

解決済み: 非常に大きな秒数 (4000 日間など) の奇妙な usleep でした。

4

1 に答える 1

0

Coroは協調マルチタスクライブラリであるため、コルーチンはスケジューラに明示的に制御を渡す必要があります。sleep/への呼び出しはusleepPerlプロセス全体をブロックし、他のコードが実行されないようにします。この場合、現在のコルーチンのみをブロックする「非ブロック」スリープを実行できます。

use Coro;
use AnyEvent;
...
Coro::AnyEvent::sleep 5;

LWPのインターフェイスがどうしても必要な場合を除いて、 AnyEvent::HTTPに切り替えることを強くお勧めします。Coro :: LWPはちょっとしたハックで、LWPの内部に非常に敏感で、フリーズする傾向があります。AnyEvent :: HTTPは、プログラムのロックアップで発生したいくつかの問題を解決し、SSL証明書の検証とsocksプロキシを含むプロキシの使用をより適切に制御できるようにしました。全体として、より優れた、より機能的なモジュールです。

于 2013-02-19T19:05:29.060 に答える