相关疑难解决方法(0)

Perl,Parallel :: ForkManager - 如何实现fork的超时

是否可以使用Parallel :: ForkManager为fork实现某种超时(时间限制)?

Basic Parallel :: ForkManager脚本如下所示

use Parallel::ForkManager;
my $pm = Parallel::ForkManager->new( 10 );
for ( 1 .. 1000 ) {
    $pm->start and next;
    # some job for fork
    $pm->finish;
}
$pm->wait_all_children();
Run Code Online (Sandbox Code Playgroud)

我想限制时间为"#for work for fork".例如,如果它没有在90秒内完成.那么它(fork)应该被杀死/终止.我想过使用它,但我不得不说,我不知道如何在Parallel :: ForkManager中使用它.

编辑

感谢hobbs和ikegami.你的建议都有效.....但只是在这个基本的例子中,而不是在我的实际脚本中:(. 截图 这些叉子将永远存在 - 说实话 - 我不知道为什么.我使用这个脚本几个月.没有改变任何东西(虽然许多事情取决于外部变量).每个fork都必须从网站下载页面,解析它并将结果保存到文件中.每叉不应超过30秒.超时设置为180秒.那些悬挂叉是完全随机的,因此很难追踪问题.这就是为什么我想出一个临时的,简单的解决方案 - 超时和杀死.

什么可能在我的代码中禁用(中断)你的超时方法?alarm()我的代码中没有任何其他地方.

编辑2

其中一个叉子,悬挂1小时38分钟并返回"超时PID" - 这就是我输入die()的内容alarm().所以超时工作...但它的晚期大约1小时36分钟;).你有什么想法?

parallel-processing perl fork timeout

7
推荐指数
1
解决办法
4923
查看次数

读取套接字:EAGAIN:资源暂时不可用

我用C++创建了一个套接字,我需要它才能有一定的连接超时.这就是发生的事情:

  • 创建套接字
  • 让它成为NON_BLOCKING
  • 呼叫连接
  • 它按预期返回-1和errno EINPROGRESS
  • 呼叫选择
  • 返回> 0,因此已建立连接
  • 再次插入插座

该部分的代码如下:

bool mastControl::prepareSocket(char * address, int port, int * sockfd) {

    struct sockaddr_in serv_addr;
    struct timeval timeout = {0,100000};
    struct timeval connTimeout;
    struct hostent * server = NULL;
    fd_set socketSet;
    socklen_t lon;
    int sockOpt = 0;
    long socketFlags = 0;
    int buffersize = 8;
    int res = 0;
    int connectReturn = 0;
    const int WAIT_TO_RECONN = 15;

    server = gethostbyname(address);
    *sockfd = socket(AF_INET, SOCK_STREAM, 0);

    if (*sockfd < 0) { …
Run Code Online (Sandbox Code Playgroud)

c++ sockets

5
推荐指数
1
解决办法
3万
查看次数

如何在perl中强制执行明确的超时?

我正在使用LWP从网页下载内容,我想限制等待页面的时间.

my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->env_proxy;
$response = $ua->get("http://XML File");
$content = $response->decoded_content;
Run Code Online (Sandbox Code Playgroud)

问题是服务器偶尔会死锁(我们试图找出原因)并且请求永远不会成功.由于服务器认为它是活动的,它会使套接字连接保持打开状态,因此LWP :: UserAgent的超时值对我们来说没有任何好处.对请求强制执行绝对超时的最佳方法是什么?

每当超时达到极限时,它就会死掉,我无法继续使用脚本!整个脚本处于循环中,它必须按顺序获取XML文件.我真的很想妥善处理这个超时并使脚本继续下一个地址.有谁知道如何做到这一点?谢谢!!

perl timeout lwp-useragent

4
推荐指数
1
解决办法
674
查看次数

标签 统计

perl ×2

timeout ×2

c++ ×1

fork ×1

lwp-useragent ×1

parallel-processing ×1

sockets ×1