Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 不同子进程中线程之间的共享队列_Multithreading_Perl_Unix - Fatal编程技术网

Multithreading 不同子进程中线程之间的共享队列

Multithreading 不同子进程中线程之间的共享队列,multithreading,perl,unix,Multithreading,Perl,Unix,我有N个fork()进程,每个进程有M个线程(当然,还有其他的吗?)。线程应该等待作业提交到某个队列中,并最终在同一队列中发布某些结果。所有线程都具有相同的优先级并遵循相同的数据流(deque()任务,enque()将其结果作为新任务列表)。我应该如何继续执行队列实现 我试着用一个两级(线程/进程)锁快速重写一个,但结果是错误的(不能真的使用绑定的数组)。我想我不想让每个线程都有自己的实例(不考虑太多) 我是否应该在一个线程上冻结/解冻任务,并使用信号量实现锁和CV,保留每个线程的实例?在线程中

我有N个fork()进程,每个进程有M个线程(当然,还有其他的吗?)。线程应该等待作业提交到某个队列中,并最终在同一队列中发布某些结果。所有线程都具有相同的优先级并遵循相同的数据流(deque()任务,enque()将其结果作为新任务列表)。我应该如何继续执行队列实现

我试着用一个两级(线程/进程)锁快速重写一个,但结果是错误的(不能真的使用绑定的数组)。我想我不想让每个线程都有自己的实例(不考虑太多)

我是否应该在一个线程上冻结/解冻任务,并使用信号量实现锁和CV,保留每个线程的实例?在线程中直接实例化IPC原语听起来很奇怪(因此我尝试:在线程级别共享IPC::Shareables)

你们中的一些僧侣做得恰到好处吗?一个没有中间件队列管理器等的平面实现?你能分享一个想法吗,也许是一个模块

谢谢

另外,我不想选择像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__

您可以使用Cache::FastMmap。在每个线程/进程中使用相同的share_文件,这样做很好

表格POD:

“通过mmap文件的共享内存缓存。它的核心是用C编写的,以提高性能。它使用fcntl锁定来确保多个进程可以同时安全地访问缓存。”


为什么要重写
Thread::Queue
?你就不能用它吗?@OlafDietsche在fork()之间?@Olaf,不,他不能。队列要么在线程(而不是进程)之间共享,要么在进程之间共享(使用
use forks;
,但这会阻止线程的创建)。我会思考拥有多个线程和多个进程是否真的值得。如果是,那么现有的分布式计算解决方案(例如)如何?听起来你对工人模型还可以。@ikegami:或rabbitmq,或mpi。对于这样一项简单的任务来说太重了(显然)
my $Cache = Cache::FastMmap->new(raw_values => 1, share_file => "/tmp/shared_file.shm");