0

我有使用 Coro、Coro::LWP 和 LWP::UserAgent 的脚本。我提出了一系列请求并通过 Coro 的 async {} 运行它们。然后我使用他们的结果并保存到文件。脚本运行数小时或有时数分钟,然后冻结。我已经进行了 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 天)。

4

1 回答 1

0

Coro 是一个协作式多任务库,因此协程必须明确地将控制权交给调度程序。您对sleep/的调用会usleep阻塞整个 Perl 进程并阻止其他代码运行;在这种情况下,您可以执行仅阻塞当前协程的“非阻塞”睡眠:

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

除非你绝对需要 LWP 的接口,顺便说一句,我强烈建议切换到AnyEvent::HTTP。Coro::LWP 有点 hack,它对 LWP 内部高度敏感并且容易冻结。AnyEvent::HTTP 解决了我的程序锁定的几个问题,并且还提供了对 SSL 证书验证和代理使用的更好控制,包括 socks 代理。它只是一个整体上更好、更有特色的模块。

于 2013-02-19T19:05:29.060 回答