Xin chào, tôi có một tập lệnh đơn giản có một tệp và chạy một tập lệnh Perl khác trên đó. Tập lệnh thực hiện điều này với mọi tệp hình ảnh trong thư mục hiện tại. Điều này đang chạy trên một máy với 2 bộ xử lý Xeon lõi tứ, 16GB ram, chạy RedHat Linux.Làm cách nào để sửa đổi tập lệnh perl của tôi để sử dụng nhiều bộ xử lý?
Kịch bản lệnh work.pl đầu tiên về cơ bản gọi magicplate.pl chuyển một số tham số và tên của tệp cho magicplate.pl để xử lý. Magic Plate mất khoảng một phút để xử lý từng hình ảnh. Bởi vì work.pl là preforming chức năng tương tự hơn 100 lần và bởi vì hệ thống có nhiều bộ vi xử lý và lõi tôi đã suy nghĩ về tách nhiệm vụ lên để nó có thể chạy nhiều lần song song. Tôi có thể chia hình ảnh lên các thư mục khác nhau nếu cần. Bất kỳ sự trợ giúp nào đều sẽ là tuyệt vời. Cảm ơn bạn
Dưới đây là những gì tôi có cho đến nay:
use strict;
use warnings;
my @initialImages = <*>;
foreach my $file (@initialImages) {
if($file =~ /.png/){
print "processing $file...\n";
my @tmp=split(/\./,$file);
my $name="";
for(my $i=0;$i<(@tmp-1);$i++) {
if($name eq "") { $name = $tmp[$i]; } else { $name=$name.".".$tmp[$i];}
}
my $exten=$tmp[(@tmp-1)];
my $orig=$name.".".$exten;
system("perl magicPlate.pl -i ".$orig." -min 4 -max 160 -d 1");
}
}
"chạy thông dịch viên perl một lần nữa và một lần nữa cho mỗi tập tin mới không phải là một ý tưởng tốt" - Có, nhưng khi bạn ngã ba, bạn không bắt đầu một thông dịch viên perl mới. Fork sao chép tiến trình cha, và Linux sử dụng CoW, vì vậy nó thậm chí còn rẻ hơn một bản sao đầy đủ. – JimB
Ngoài ra, tại sao bạn bắt đầu một thông dịch viên mới sau khi ngã ba? Chạy mã perl trong tiến trình con mới. – JimB
@JimB: Tôi có nghĩa là cuộc gọi hệ thống không phải forking. Và tôi sử dụng cuộc gọi hệ thống vì mã ban đầu đã sử dụng nó. – gangabass