【发布时间】:2012-08-28 06:50:52
【问题描述】:
我有使用 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 天)。
【问题讨论】:
-
您可以尝试LWP::Protocol::Coro::http 而不是Coro::LWP(这有点骇人听闻)。但从表面上看,这与 LWP 方面有关。
-
根据 strace 程序结束所有请求并完成对请求结果的处理。它肯定退出了 async 的 join 命令并走得更远。
-
在与 unix 人员交谈后,似乎我已经睡了很多时间,脚本只是为非常非常多的日志而睡觉。也许我的睡眠时间计算有误:(
标签: perl asynchronous strace