【问题标题】:Coro + Coro::LWP freezesCoro + Coro::LWP 冻结
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 2019-10-14
    • 2014-04-10
    • 1970-01-01
    相关资源
    最近更新 更多