如果执行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密集型任务,您必须使用多处理.
我一直在编写一个"检查器"系统,对各种服务,系统,数据库,文件等执行各种"检查"."检查"本质上是通用的,可以是任何东西.所有检查都以他们通过或失败的通用格式天气报告,无论可能是什么.
它以模块化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) 我试图缩小我捕获的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) 我不知道这是否可行,但我想从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)