我有使用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天)。
答案 0 :(得分:0)
Coro是一个合作的多任务库,因此协同程序必须明确地控制调度程序。您对sleep
/ usleep
的调用会阻止整个Perl进程并阻止其他代码运行;在这种情况下,您可以执行“非阻塞”睡眠,只会阻止您当前的协程:
use Coro;
use AnyEvent;
...
Coro::AnyEvent::sleep 5;
除非您绝对需要LWP的界面,顺便说一句,我强烈建议您切换到AnyEvent::HTTP。 Coro :: LWP有点像黑客,它对LWP内部高度敏感,容易发生冻结。 AnyEvent :: HTTP解决了我的程序锁定时遇到的几个问题,并且还提供了对SSL证书验证和代理(包括socks代理)使用的更好控制。它只是一个更好,更有特色的模块。