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
Multithreading 将线程迁移到fork_Multithreading_Perl - Fatal编程技术网

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