- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的主要目标是为大量对象做一些(外部依赖时间昂贵的)工作。为此,如果我直接去做,会花费很多时间。所以我决定进入并行模式并 fork 一些(4-8,让我们看看)子进程,每个子进程为较小的对象集完成工作。在主(父)进程中,我想打印出与单进程版本相同的总体进度统计信息。
但是,当我 fork 4 个子进程并在其中做一些工作时,我可以看到它们还活着,但实际上只有一个在做某事并将信息发送回父进程。
这是我到目前为止完成的代码 - 耗时的部分是用随机 usleep 模拟的,它很好地模拟了它的行为。
#!/usr/bin/env perl
use strict;
use warnings;
use DateTime;
use DateTime::Format::HTTP;
use Time::HiRes;
my @to_be_processed = (1..300000);
my @queues;
my $nprocs = 4;
my $parent_from_child;
my @child_from_parent;
my @child_to_parent;
$SIG{CHLD} = 'IGNORE';
$|=1; # autoflush
my %stat = (
total => scalar(@to_be_processed),
processed => 0,
time_started => [Time::HiRes::gettimeofday],
);
# divide the list into queues for each subprocess
for (my $i = 0; $i < $stat{total}; $i++ ) {
my $queue = $i % $nprocs;
push @{$queues[$queue]}, $to_be_processed[$i];
}
# for progress simulation
srand (time ^ $$);
for (my $proc = 0; $proc < $nprocs; $proc++) {
# set up the pipes
pipe $parent_from_child, $child_to_parent[$proc] or die "pipe failed - $!";
# fork
defined(my $pid = fork) or die "fork failed - $!";
if ($pid) {
# parent
close $child_to_parent[$proc];
printf("[%u] parent says: child %u created with pid %u\n", $$, $proc, $pid);
}
else {
# child
close $parent_from_child;
open(STDOUT, ">&=" . fileno($child_to_parent[$proc])) or die "open failed - $!";
warn(sprintf("[%u] child alive with %u entries\n", $$, scalar(@{$queues[$proc]})));
foreach my $id (@{$queues[$proc]}) {
printf("START: %s\n", $id);
# simulation of progress
my $random_microseconds = int(rand(3000000))+200000;
warn(sprintf("[%u] child 'works' for %u microseconds", $$, $random_microseconds));
Time::HiRes::usleep( $random_microseconds );
printf("DONE\n")
}
exit(0);
}
}
# parent: receive data from children and print overall statistics
while (<$parent_from_child>) {
chomp(my $line = $_);
if ($line =~ m/^START: (\S+)/) {
my ($id) = @_;
printf("%6u/%6u", $stat{processed}, $stat{total});
if ($stat{time_avg}) {
my $remaining = ($stat{total} - $stat{processed}) * $stat{time_avg};
my $eta = DateTime->from_epoch( epoch => time + $remaining );
$eta->set_time_zone('Europe/Berlin');
printf(" (ETA %s)", DateTime::Format::HTTP->format_isoz($eta));
}
printf("\r");
}
elsif ($line =~ /^DONE/) {
$stat{processed}++;
$stat{time_processed} = Time::HiRes::tv_interval( $stat{time_started} );
$stat{time_avg} = $stat{time_processed} / $stat{processed};
}
else {
printf("%s\n", $line);
}
}
通常应该消除警告。如果你运行它,你应该看到只有一个 child 工作。我的问题是:为什么?我的错误在哪里?我怎样才能让所有人都完成这项工作?
谢谢K.
最佳答案
你可以在strace下运行perl,你会发现你的 child 的生命相当短暂,看起来像这样:
close(3) = 0
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff753b3a10) = -1 EINVAL (Invalid argument)
lseek(4, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
fstat(4, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
dup2(4, 1) = 1
dup(4) = 3
fcntl(4, F_GETFD) = 0x1 (flags FD_CLOEXEC)
dup2(3, 4) = 4
fcntl(4, F_SETFD, FD_CLOEXEC) = 0
close(3) = 0
fcntl(1, F_SETFD, 0) = 0
write(2, "[30629] child alive with 75000 e"..., 39) = 39
brk(0x3582000) = 0x3582000
write(1, "START: 1\n", 9) = -1 EPIPE (Broken pipe)
--- SIGPIPE (Broken pipe) @ 0 (0) ---
这就是为什么:
pipe $parent_from_child, $child_to_parent[$proc] or die "pipe failed - $!";
您在管道的错误参数上使用了数组。您需要在父级中保持所有读取 端打开。相反,您设置了一个数组,以便父级可以保持所有写入端打开(但随后在您的父级 block 中,您立即关闭写入端)。因此,在下一次循环中,pipe
创建一个新句柄,并将其分配给 $parent_from_child
。旧值因此不再有引用,perl 将它清理干净——意思是,它关闭文件句柄。所以你的 child 除了最后一个都死于SIGPIPE。
我认为您的印象是您可以重复使用该读取句柄并为其分配多个写入句柄。你不能。 pipe
总是生成一个新的读句柄和一个新的写句柄。
如果你真的想共享同一个读句柄(你可能不想,当两个客户端的输出交错时这会导致损坏),只需在循环之外创建一次。所有的 child 都将通过 fork
继承相同的写句柄。更有可能的是,您希望每个 child 一个,并且您必须使用 select
循环来查看哪些有可用的输出,然后读取它们。
或者,我相信 CPAN 有适合您的现成解决方案(或十个)。
关于perl - 如何 fork 和读取多个子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8456694/
我试图四处移动一些 div,但我似乎无法通过对象对象选择它们: http://jsfiddle.net/kL3c8/1/ 1 2
我在 WP 网站上使用 Ninja Forms。有 2 个不同的字段(文本框和提交按钮)是单独的 DIV,它们都是单个 DIV 的子项。 它们出现在连续的行上,但我似乎无法在同一行上找到它们。帮忙?
我专门针对第 n 个 child (2n),但是具有给定类的 sibling 的第一个、第三个等应用了 css。 http://jsfiddle.net/relitnosmoge/9HCnH/1/ .
我有一个页面可以引入数据库条目并显示它们,并且我已经为所有其他条目/列表提供了这种样式: hjl:nth-child(odd) { background: #F2F2F2;} 这是我的 HTML/PH
我正在显示每个字母具有相同背景(宽度 31px )的字母表。我需要一半的字母宽度为 30px。这由以下人员处理: div.alpha:nth-child(even) {width: 30px;} 但是
我需要从一些大的嵌套字典中获取一些值。出于懒惰,我决定编写一个递归调用自身的函数,直到找到最后一个 child ,或者叶子为空。 由于会弹出字典,并且每次调用都会生成一个新字典,我想知道这有多有效。
我有 2 个 css 类 leftColumn 和 rightColumn 排列在 React SPA 的行布局中。问题在于,当浏览器变窄时,rightColumn 会在 leftColumn“下方”
我有这个 fiddle ,我想在默认情况下仅显示第一张照片并隐藏其余照片,并通过每次鼠标滚动更改照片。 var i 由 mousescroll 确定,如果 i 5,我希望操作中断,因为没有第 n 个
我有一个父 div 和 2 个嵌套的子 div。当第二个子 div 不包含任何内容时,我想隐藏第一个子 div 和父 div。我想知道如何做到这一点? 我有 2 个子 div 的原因是因为我正在创建一
我有一个父 div 和 2 个嵌套的子 div。当第二个子 div 不包含任何内容时,我想隐藏第一个子 div 和父 div。我想知道如何做到这一点? 当 .portfolio-works-conta
我注意到在我的浏览器中,SSL 证书链始终至少有 2 个子 CA。总是这样吗?如果属实,有人知道为什么吗? 最佳答案 通常至少有一个中间 CA,因为它可以更轻松地管理子公司和管理滚动,但这不是必需的。
我在让交叉淡入淡出动画停止在最后一个子节点上时遇到了一些麻烦。我知道 animation-fill-mode: forwards ,但它似乎不起作用(我试过将它放在不同的地方,例如在最初的 .cros
我想水平对齐 3 个不同的子 div。这 3 个 div 包含 1 个图像(高度和宽度 px)。每个 div 都有一个悬停链接(但我希望我的 onmouseover 仅位于图像上方,而不是位于 div
我正忙于 Bigcommerce 网站的设计,发现列表项及其各自背景存在 css 语法问题。 列表项标题和列表项本身是从数据库生成的。这是我的代码的样子: .Left #SideCategoryLis
所以我有一个父 div(100% 宽度)和其中的 3 个子 div(也是 100% 宽度)。我如何将“默认显示的 div”设置为第二个子元素,以便左侧 div 向左离开屏幕,而右侧 div 向右离开屏
我正在尝试将 vector 拆分为 n 个部分。我检查了以下解决方案 How to split a vector into n "almost equal" parts 我根据这个评论得出了以下代码:
下面是我的div: Abc pqr function AppendDiv(10,11) { var eFrom = $('#' + 10); var toD
我试图让我的 html 页面与 JSF 一起工作,并且偶然发现了一个问题,即如何让 nth-child css 选择器与 jsf 一起工作 repeat标签?现在,对于 repeat 标签生成的每个元
这个问题在这里已经有了答案: How do you keep parents of floated elements from collapsing? [duplicate] (15 个答案) 关闭
试图整理我的 CSS,一团糟,我有许多 ID 分布在 div 和子 div 中,以便我能够在 CSS 中选择它们。 我想知道这样做的正确方法是什么? 我考虑过使用类,这似乎是一种更好的方法,但仍然在每
我是一名优秀的程序员,十分优秀!