gpt4 book ai didi

multithreading - Perl - 如何在线程之间共享对象

转载 作者:行者123 更新时间:2023-12-02 09:15:58 26 4
gpt4 key购买 nike

我的脚本具有对象的哈希值 - 所有单个类 (SampleClass.pm)。以下是我用来创建对象的方法。

$objectHash{'foo'} = SampleClass->new();
$objectHash{'bar'} = SampleClass->new();
.
.

然后我生成几个线程(比如 5 个),每个线程按照指示执行其工作。

现在假设线程 1 写入一个对象 -

$objectHash{'foo'}->settimeWhenISaidHello($time);

然后退出。现在,当 Thread2 开始工作并检查如下所示的值时

$lastHelloTime = $objectHash{'foo'}->gettimeWhenISaidHello($time);

它得到未定义或空值。我想跨线程共享这些值。怎么可能?

此外,我的类构造函数 new 将哈希值和哈希数组作为成员变量,如下所示。

sub new
{
.
.
listOfGuysToSayHello = {}; #This is an array with guy name as key and array value as data
SchoolsWithStudentsToSayHellow = {}; #this is array of hashes
.
.
}

此外,我已经解决了这个问题 - how to access perl objects in threads答案并不能满足我的要求。

请告诉我你的想法。

最佳答案

我建议首先共享对象不是一个好主意 - 可以使用 threads::shared 来完成但存在一些限制,并且您可能会引入一些竞争条件。

所以,我会说 - 使用 Thread::Queue在线程之间进行通信,并使用 Storable序列化为 freezethaw

这是一个有点简单的例子,但希望能够说明这一点?也就是说,您不是“共享”对象,而是只是将它们作为序列化数据结构传递。如果实例化一个对象会导致系统状态发生变化(例如打开到数据库的连接或类似的情况),它确实会有些崩溃——但这在线程上下文中本质上是很难做到的。

#!/usr/bin/env perl

use strict;
use warnings;

package MyObject;

sub new {
my ( $class, %args ) = @_;
my $self = \%args;
bless $self, $class;
return $self;
}

sub get_value {
my ( $self, $key ) = @_;
return $self->{$key} // 0;
}

sub set_value {
my ( $self, $key, $value ) = @_;
$self->{$key} = $value;
}

package main;

use threads;
use Storable qw ( freeze thaw );
use Thread::Queue;

my $work_q = Thread::Queue->new;
my $result_q = Thread::Queue->new;

sub worker {
while ( my $serialised = $work_q->dequeue ) {
my $local_obj = thaw $serialised;
print threads->self->tid, " is processing object with id ",
$local_obj->get_value('id'), "\n";
$local_obj->set_value( 'processed_by', threads->self->tid );
$result_q->enqueue( freeze $local_obj );
}
}

threads->create( \&worker ) for 1 .. 10;

for ( 1 .. 100 ) {
my $obj = MyObject->new( id => $_ );
$work_q->enqueue( freeze $obj );
}
$work_q->end;
$_->join for threads->list;

while ( my $ser_obj = $result_q->dequeue_nb ) {
my $result_obj = thaw $ser_obj;
print "Object with ID of :", $result_obj->get_value('id'),
" was processed by thread ", $result_obj->get_value('processed_by'),
"\n";
}

关于multithreading - Perl - 如何在线程之间共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47198657/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com