Coro + Coro :: LWP冻结

时间:2012-08-28 06:50:52

标签: perl asynchronous strace

我有使用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天)。

1 个答案:

答案 0 :(得分:0)

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

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

除非您绝对需要LWP的界面,顺便说一句,我强烈建议您切换到AnyEvent::HTTP。 Coro :: LWP有点像黑客,它对LWP内部高度敏感,容易发生冻结。 AnyEvent :: HTTP解决了我的程序锁定时遇到的几个问题,并且还提供了对SSL证书验证和代理(包括socks代理)使用的更好控制。它只是一个更好,更有特色的模块。