Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl Coro&x2B;Coro::LWP冻结_Perl_Asynchronous_Strace - Fatal编程技术网

Perl Coro&x2B;Coro::LWP冻结

Perl Coro&x2B;Coro::LWP冻结,perl,asynchronous,strace,Perl,Asynchronous,Strace,我有使用Coro、Coro::LWP和LWP::UserAgent的脚本。 我创建了一个请求数组,并通过Coro的async{}运行它们。然后我使用它们的结果并保存到文件中。 脚本运行数小时,有时运行数分钟,然后冻结。我查了一下,看看它在干什么。 有一系列操作,但在保存结果后,在冻结之前有以下操作: rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0 r

我有使用Coro、Coro::LWP和LWP::UserAgent的脚本。 我创建了一个请求数组,并通过Coro的async{}运行它们。然后我使用它们的结果并保存到文件中。 脚本运行数小时,有时运行数分钟,然后冻结。我查了一下,看看它在干什么。 有一系列操作,但在保存结果后,在冻结之前有以下操作:

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 ...>
rt_sigprocmask(SIG_块,[CHLD],[8)=0
rt_sigaction(SIGCHLD,NULL,{SIG_DFL,[],0},8)=0
rt_sigprocmask(SIG_SETMASK,[],NULL,8)=0
奈米睡眠({1211417888,0},{1211354002,168413065})=?ERESTART\u重新启动块(待重新启动)
---(窗口更改)@0(0)---
重新启动_syscall()=?ERESTART\u重新启动块(待重新启动)
---(窗口更改)@0(0)---
重新启动系统调用(
有什么奇怪的东西能解释冷冻吗

交叉张贴在


解决方案:这是一个奇怪的usleep,有非常大的秒数(比如4000天).

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

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

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

您可以试试,而不是(这有点粗俗)。但从表面上看,这与LWP方面的事情有关。根据strace,程序结束所有请求,并完成对请求结果的处理。它肯定退出了async的join命令并进一步。在与unix人员进行了一些交谈之后,似乎我有一个usleep,时间非常长,脚本只是休眠了一段时间y个日志。可能是我的睡眠时间计算错误:(