Multithreading 将线程迁移到fork
应该用Multithreading 将线程迁移到fork,multithreading,perl,Multithreading,Perl,应该用forks::shared替换threads::shared,但是我应该如何替换Thread::Queue 如果可能的话,我想把下面的代码转换成forks sub Qfac { use threads; use threads::shared; use Thread::Queue; my ($worker, $arrid, $arg) = @_; $arrid ||= []; $arg ||= {}; my %tr; my %h :shared;
forks::shared
替换threads::shared
,但是我应该如何替换Thread::Queue
如果可能的话,我想把下面的代码转换成forks
sub Qfac {
use threads;
use threads::shared;
use Thread::Queue;
my ($worker, $arrid, $arg) = @_;
$arrid ||= [];
$arg ||= {};
my %tr;
my %h :shared;
my %qe = map { $_ => Thread::Queue->new() } @$arrid;
for my $id (@$arrid) {
my $q = $qe{$id};
$tr{$id} = threads->create($arg, sub{
my $me = { id => $id };
while (my $item = $q->dequeue()) {
$me->{item} = $item;
eval { $worker->($me, \%h) };
$me->{err} = $@ if $@;
my $temp = threads::shared::shared_clone($me);
{
lock (%h);
$h{$id} = $temp;
}
}
});
$tr{$id}->detach();
}
##
return sub {
my $act = shift;
if ($act eq "getshared") { return @_ ? @h{@_} : \%h }
elsif ($act eq "enqueue") { $_->enqueue(@_) for values %qe }
elsif ($act eq "getqe") { return \%qe }
elsif ($act eq "gettr") { return \%tr }
elsif ($act eq "getssize") { return threads->get_stack_size() }
elsif ($act eq "setssize") { return threads->set_stack_size(@_) }
else { die "unknown method" }
};
}
my $worker = sub {
my ($me) = @_;
my $id = $me->{id};
# $me->{foo} = "bar";
};
my $qf = Qfac($worker, [ 0 .. 10 ]);
# Send work to the thread
$qf->("enqueue", "do_something");
# ...
my $shared = $qf->("getshared");
使用叉子
(及其::shared
)是使用线程的替代品
(及其::shared
),而Thread::Queue使用Thread::shared,所以Thread::Queue将继续正常工作
use if $ARGV[0], "forks";
use threads; # No effect under "use forks;"
use Thread::Queue;
my $q = Thread::Queue->new();
print "$$\n";
async {
print "$$\n";
print "$_\n" while $_ = $q->dequeue();
};
$q->enqueue($_) for 1..4;
$q->end();
$_->join() for threads->list();
(您需要将使用forks::shared;
添加到forks的旧版本中。)使用forks
(及其::shared
)是使用线程的替代品
(及其::shared
),而Thread::Queue使用Thread::shared,所以Thread::Queue将继续正常工作
use if $ARGV[0], "forks";
use threads; # No effect under "use forks;"
use Thread::Queue;
my $q = Thread::Queue->new();
print "$$\n";
async {
print "$$\n";
print "$_\n" while $_ = $q->dequeue();
};
$q->enqueue($_) for 1..4;
$q->end();
$_->join() for threads->list();
(您需要添加
使用forks::shared;
与旧版本的forks。)使用forks之间的管道?@ratchetfreak您能推荐cpan模块吗?螺纹、叉子、管道。。。“我感觉自己就像置身于查尔斯·狄更斯的故事中。”@woolstar似乎unix作家也受到了他的影响;)使用叉子之间的管道?@ratchetfreak你能推荐cpan模块吗?螺纹,叉子,管道。。。“我感觉自己就像置身于查尔斯·狄更斯的故事中。”@woolstar似乎unix作家也受到了他的影响;)tnx,我稍后将尝试使用分离线程,顺便说一句,use if$ARGV[0],“forks”的含义是什么代码>?如果$ARGV[0]为true,则导致程序使用forks,否则使用threads。检查输出中的pid。演示forks.pm是threads.pm.tnx的替代品,稍后我将使用分离的线程进行尝试,顺便说一句,如果$ARGV[0],“forks”使用会有什么影响代码>?如果$ARGV[0]为true,则导致程序使用forks,否则使用threads。检查输出中的pid。演示forks.pm是threads.pm的替代品。
$ perl x.pl 1
6054
6056
1
2
3
4