小编pco*_*ley的帖子

Perl线程中的垃圾收集

这个问题是好奇心,因为下面的两个项目之一有效.

我正在使用Image :: Magick调整大量照片的大小.为了节省一些时间,我在自己的线程中处理每张照片,并使用信号量来限制同时工作的线程数.最初我允许每个线程一次运行,但脚本会快速为所有照片分配3.5 GB(我只有2GB可用),并且由于所有交换到磁盘,脚本运行速度比正常慢5倍.

工作,信号量版本代码看起来像这样:

use threads;
use Thread::Semaphore;
use Image::Magick;

my $s = Thread::Semaphore->new(4);
foreach ( @photos ) {
    threads->create( \&launch_thread, $s );
}
foreach my $thr ( reverse threads->list() ) {
    $thr->join();
}

sub launch_thread {
    my $s = shift;
    $s->down();
    my $image = Image::Magick->new();

    # do memory-heavy work here

    $s->up();
}
Run Code Online (Sandbox Code Playgroud)

这样可以快速分配500MB,运行得非常好而且不需要更多.(线程以相反的顺序连接以构成一个点.)

我想知道是否可能会同时启动80个线程并阻止大部分线程的开销,所以我改变了我的脚本以阻止主线程:

my $s = Thread::Semaphore->new(4);
foreach ( @photos ) {
    $s->down();
    threads->create( \&launch_thread, $s );
}
foreach my $thr ( threads->list() ) {
    $thr->join(); …
Run Code Online (Sandbox Code Playgroud)

perl multithreading garbage-collection

7
推荐指数
1
解决办法
357
查看次数

包裹是"全局使用还是需要它们的功能?

如果这个问题不适合StackOverflow,请道歉.我怀疑答案很大程度上是一个意见问题(除非其中一个风格指南有推荐).

我的代码看起来像这样

use File::Temp;

sub foo {
    ...
}
sub bar {
    ...
}
sub baz {
    my $fh = tempfile();
    ...
}
Run Code Online (Sandbox Code Playgroud)

baz是唯一使用的子程序,File::Temp我没有使用AutoLoader.将use声明置于其中是否合理baz,还是应将其保留在脚本的顶部?

perl

3
推荐指数
1
解决办法
56
查看次数

标签 统计

perl ×2

garbage-collection ×1

multithreading ×1