gpt4 book ai didi

multithreading - Perl:在线程之间共享复杂的数据结构

转载 作者:行者123 更新时间:2023-12-04 06:41:29 25 4
gpt4 key购买 nike

我喜欢在线程之间共享复杂的数据结构。
据我所知,线程是不可能的:共享(只有基本类型是可共享的)。

所以我考虑使用 JSON 或 Storable 对结构进行序列化/反序列化,因此它只是一个我可以完美共享的字符串。但是我需要在使用前拆开包装,更换后包装。

  • 这是解决该问题的常用方法吗?
  • 有更好的方法吗?
  • 你更喜欢 JSON 还是 Storable 或其他什么?

  • 感谢帮助!

    编辑

    我只是用 Storable 和 JSON 做了一些测试。 JSON 更快,并生成更小的序列化字符串。我没想到的是。

    最佳答案

    处理这个问题的时候,我用了Thread::Queue传递我的对象,通常使用 Storable连载。

    我没有费心进行性能比较,因为通常我的数据传递开销不是限制因素。

    注 - Storable的主要优势是它允许一些有限的对象支持(不要 - 小心 - 它仅在您的对象是自包含的情况下才有效):

    #!/usr/bin/env perl
    use strict;
    use warnings;

    package MyObject;

    sub new {
    my ( $class, $id ) = @_;
    my $self = {};
    $self -> {id} = $id;
    $self -> {access_count} = 0;
    bless $self, $class;
    return $self;
    }

    sub access_thing {
    my ( $self ) = @_;
    return $self -> {access_count}++;
    }

    sub get_id {
    my ( $self ) = @_;
    return $self -> {id};
    }

    package main;

    use threads;
    use Thread::Queue;

    use Storable qw ( freeze thaw );

    my $thread_count = 10;

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

    sub worker {
    while ( my $item = $work_q -> dequeue ) {
    my $obj = thaw ( $item );
    print $obj -> get_id, ": ", $obj -> access_thing,"\n";

    }
    }

    for (1..$thread_count) {
    threads -> create (\&worker);
    }

    for my $id ( 0..1000 ) {
    my $obj = MyObject -> new ( $id );
    $work_q -> enqueue ( freeze ( $obj ) );
    }

    $work_q -> end;

    $_ -> join for threads -> list;

    如果 JSON 会限制您使用数组/散列数据结构 - 这可能适合您的用例。

    关于multithreading - Perl:在线程之间共享复杂的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46703949/

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