Tôi có một tập lệnh Perl khởi chạy 2 luồng, một luồng cho mỗi bộ xử lý. Tôi cần nó để chờ đợi một sợi để kết thúc, nếu một sợi kết thúc một cái mới được sinh ra. Dường như phương thức kết nối chặn phần còn lại của chương trình, do đó luồng thứ hai không thể kết thúc cho đến khi tất cả mọi thứ mà luồng đầu tiên thực hiện được thực hiện để loại bỏ mục đích của nó.Trong Perl, làm thế nào tôi có thể chờ cho các chủ đề kết thúc song song?
Tôi đã thử phương pháp is_joinable
nhưng điều đó dường như không làm điều đó.
Dưới đây là một số mã của tôi:
use threads;
use threads::shared;
@file_list = @ARGV; #Our file list
$nofiles = $#file_list + 1; #Real number of files
$currfile = 1; #Current number of file to process
my %MSG : shared; #shared hash
$thr0 = threads->new(\&process, shift(@file_list));
$currfile++;
$thr1 = threads->new(\&process, shift(@file_list));
$currfile++;
while(1){
if ($thr0->is_joinable()) {
$thr0->join;
#check if there are files left to process
if($currfile <= $nofiles){
$thr0 = threads->new(\&process, shift(@file_list));
$currfile++;
}
}
if ($thr1->is_joinable()) {
$thr1->join;
#check if there are files left to process
if($currfile <= $nofiles){
$thr1 = threads->new(\&process, shift(@file_list));
$currfile++;
}
}
}
sub process{
print "Opening $currfile of $nofiles\n";
#do some stuff
if(some condition){
lock(%MSG);
#write stuff to hash
}
print "Closing $currfile of $nofiles\n";
}
Kết quả của việc này là:
Opening 1 of 4
Opening 2 of 4
Closing 1 of 4
Opening 3 of 4
Closing 3 of 4
Opening 4 of 4
Closing 2 of 4
Closing 4 of 4
Hôm nay bạn là thần của tôi;) giải pháp tốt đẹp .. Một điều nữa: Để đặt các khóa trên danh sách, tôi thực hiện việc này: nếu (1 == 1) {lock (@file_list); $ file = shift (@file_list); } Tôi cần điều này nếu nó được mở khóa ở cuối trước khi chạy chức năng. Điều này có vẻ giống như một khá noob-hack mặc dù :) bất kỳ cách nào tốt hơn? – Pmarcoen