小编joh*_*doe的帖子

为阻塞操作启动新线程是不好的做法(Perl)

如果执行CPU密集型任务,我认为每个核心有一个线程是最佳的.如果你有一个4核CPU,你可以运行4个CPU密集子程序实例而不会受到任何惩罚.例如,我曾经在四核CPU上实验性地运行了四个CPU密集型算法实例.每个过程最多四次没有减少.在第五个实例中,所有实例都需要更长

阻止操作的情况如何?假设我有一个包含1,000个网址的列表.我一直在做以下事情:

(请不要介意任何语法错误,我只是嘲笑这个)

my @threads;
foreach my $url (@urlList) {    
     push @threads, async {
         my $response = $ua->get($url);
         return $response->content;   
     }
}

foreach my $thread (@threads) {
    my $response = $thread->join;
    do_stuff($response); 
}
Run Code Online (Sandbox Code Playgroud)

我基本上开始了与URL列表中的URL一样多的线程.如果有一百万个网址,则会启动一百万个主题.这是最优的,如果不是最佳线程数吗?对于可以等待的任何阻塞I/O操作(读取文件,数据库查询等),使用线程是一种很好的做法吗?

相关奖金问题

出于好奇,Perl线程的工作方式与Python相同,而且它是GIL吗?使用python来获得多线程的好处,并将所有内核用于CPU密集型任务,您必须使用多处理.

perl multithreading thread-safety blocking

11
推荐指数
1
解决办法
832
查看次数

"任何"代码的Perl异步任务,无论它是什么?

我一直在编写一个"检查器"系统,对各种服务,系统,数据库,文件等执行各种"检查"."检查"本质上是通用的,可以是任何东西.所有检查都以他们通过或失败的通用格式天气报告,无论可能是什么.

它以模块化OO方式编写,因此开发人员可以简单地遵循框架并独立于一个和另一个编写检查.每个对象都包含一个共享的报告对象,在运行检查后,他们只需要$ self - > {'reporting'} - > report(params).定义了参数,并假设开发人员适当报告.报告对象然后索引这些报告.我的主加载器脚本包含如下条目:

my $reportingObject = new Checks::Reporting(params);
my @checks;

push @checks, new Checks::Check_One($reportingObject, params));
push @checks, new Checks::Check_One($reportingObject, params));
.
.
push @checks, new Checks::Check_N($reportingObject, params));
Run Code Online (Sandbox Code Playgroud)

要完成检查并在完成报告后完成报告,我一直在做:

foreach my $check (@checks) {
    $check->run_stuff();
}

$reportingObject->finalize_report();
Run Code Online (Sandbox Code Playgroud)

现在,由于这些检查完全独立(不用担心报告对象),因此它们可以并行运行.作为一项改进,我做了:

my @threads;
foreach my $check (@checks) {
    push @threads, async { $check->run_stuff(); }
}

foreach my $thread (@threads) {
    $thread->join;
}

#All threads are complete, and thus all checks are done
$reportingObject->finalize_report();
Run Code Online (Sandbox Code Playgroud)

正如我之前所说,开发人员将彼此独立地编写Checks.有些检查很简单,有些则不是.简单检查可能没有异步代码,但其他人可能需要在内部异步运行,例如

sub do_check {
   my …
Run Code Online (Sandbox Code Playgroud)

perl multithreading asynchronous

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

在C中缩放原始的24位像素图

我试图缩小我捕获的X显示的大小,以便在新窗口中显示它.我尝试对各个RGB组件求平均值,但图像看起来不太好.这是我的算法:

  img = XGetImage(d_remote,RootWindow(d_remote,0),0,0,attr.width,attr.height,XAllPlanes(),ZPixmap);

   int i;
   int j;
   for(i=0;i<attr.height;i=i+2){
        for(j=0;j<attr.width;j=j+2) {
                unsigned long p1 = XGetPixel(img, j, i);
                unsigned long p1R = p1 & 0x00ff0000;
                unsigned long p1G = p1 & 0x0000ff00;
                unsigned long p1B = p1 & 0x000000ff;

                unsigned long p2 = XGetPixel(img, j+1, i);
                unsigned long p2R = p2 & 0x00ff0000;
                unsigned long p2G = p2 & 0x0000ff00;
                unsigned long p2B = p2 & 0x000000ff;

                unsigned long p3 = XGetPixel(img, j, i+1);
                unsigned long p3R = p3 & …
Run Code Online (Sandbox Code Playgroud)

c image pixel xlib

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

从超类调用已知的子类函数?

我不知道这是否可行,但我想从Perl调用一个已知的子类函数.我需要一些"通用"来称呼更具体的东西.我的超类将假设所有子类的类都定义了已知的函数.我想这与Java"implements"类似.

例如,假设我有以下代码:

GenericStory.pm

package Story::GenericStory;

sub new{
   my $class = shift;
   my $self = {};

   bless $self, class;
   return $self;
}

sub tellStory {
   my $self;

   #do common things
   print "Once upon a time ". $self->specifics();
}
Run Code Online (Sandbox Code Playgroud)

#

Story1.pm

package Story::Story1;
use base qw ( Story::GenericStory );

sub new {
   my $class = shift;
   my $self = $class->SUPER::new(@_);

   return $self;
}

sub specifics {
   my $self;
   print " there was a dragon\n";
}
Run Code Online (Sandbox Code Playgroud)

#

Story2.pm

package Story::Story2;
use base qw …
Run Code Online (Sandbox Code Playgroud)

oop perl class subclass superclass

2
推荐指数
1
解决办法
268
查看次数