我有N个fork()ed进程,每个进程有M个线程(当然,还有其他什么?)。线程应该等待提交到某个队列的作业,并最终在同一队列中发布一些结果。所有线程都具有相同的优先级并且尊重相同的数据流(deque()任务,enque()它的结果是新任务列表)。我该如何进行队列实施?
我尝试使用Thread::Queue作为IPC::Shareable快速重写@queue,enqueue()/dequeue()使用两级(线程/进程)锁定,但是结果证明是错的(真的不能:share IPC::Shareable绑定数组。我想我不想让每个线程都携带自己的IPC::Shareable实例(不用多想)?
我是否应该在IPC::Msg上冻结/解冻任务,并使用信号量实现锁定和CV,保留每个线程IPC::Msg个实例?在一个线程中直接实例化IPC原语听起来很奇怪(因此我尝试:在线程级别共享IPC :: Shareables)。
你们中的一些僧人是否做得恰到好处并同时发声?一个扁平的实现,没有中间件队列管理器等等?你能分享一个想法,也许是一个模块吗?
谢谢!
P.S。我宁愿不选择像mpi,rabbitmq等那样繁重的现有实现。
#!/usr/bin/perl
use strict;
use warnings;
use Carp qw/croak/;
use threads;
use threads::shared;
use insert::your::queue::impl::here;
que_make_init();
my $numthreads = 4;
my $numprocs = 4;
sub runthreads
{
foreach (1..$numthreads) {
@retcodes = map { $_->join } threads->create( sub {
my $q = que_get_process_level_shared_instance();
while ( (my $task = @q->get())) {
@q->put(process($task));
}
});
}
#do_something(@retcodes) ...
exit(0);
}
my %proctable = map {
croak unless defined (my $pid = fork());
runthreads if $pid == 0;
$pid => -1;
} (0..$numprocs-1);
#waitpid(), etc
__END__
答案 0 :(得分:0)
您可以使用Cache :: FastMmap。在每个线程/进程中使用相同的share_file,你很好。
表格POD:
“通过mmap的文件共享内存缓存。它的核心是用C语言编写的,用于提高性能。它使用fcntl锁定来确保多个进程可以同时安全地访问缓存。”
my $Cache = Cache::FastMmap->new(raw_values => 1, share_file => "/tmp/shared_file.shm");