Tôi có một chương trình (Perl) khởi động một số lượng lớn các luồng (mỗi người chịu trách nhiệm tạo đồ họa dựa trên xử lý dữ liệu). Mỗi thread Tôi bắt đầu sử dụng:Làm thế nào để giới hạn số lượng tối đa của các chủ đề song song trong perl
my @threads //list to store threads that have been launched
push @threads,threads->create(\mySubName,params...);
Các bài bắn ra một cách chính xác nhưng sau một thời gian, sau khi tôi đã mở một vài trong số họ Perl tai nạn thông dịch viên (tôi giả sử nó có liên quan đến bộ nhớ?). Vì vậy, giải pháp của tôi là giới hạn số lượng chủ đề tôi mở cùng một lúc, tôi đã chọn 15. Và tôi muốn thêm một phụ trước mỗi dòng tạo để kiểm tra xem có ổn không nếu bạn muốn tắt chuỗi tiếp theo hoặc thực hiện chế độ ngủ trong khi chờ cho một kết thúc. Đây là cách tôi đã cố gắng để làm điều đó.
sub checkThreads{
my $addThread = 0;
until($addThread){
my $totalThreads = 0;
foreach my $task (@threads){
if($task->is_running()){$totalThreads++;}
}
if($totalThreads <= 15){
print "Ok to add new thread, carry on!\n";
$addthread = 1;
}else{
print "Waiting for $totalThreads threads to fire next one...\n";
sleep 2;
}
}
}
Vì vậy, mỗi khi tôi muốn tạo một chủ đề mới tôi sẽ chỉ gọi
&checkThreads;
Và đó sẽ chăm sóc để tạo ra một sự chậm trễ trong khi tôi chờ đợi đối với một số chủ đề để làm sạch. Vấn đề là khi tôi gọi sub rằng, thời điểm này tôi nhấn dòng nơi tôi kiểm tra:
$task->is_running()
Các thoát khỏi chương trình và ngừng chạy mà không có bất kỳ lỗi hoặc cảnh báo. Tôi chỉ muốn một phụ mà đếm các chủ đề đang chạy để hạn chế chúng.
Làm cách nào để tôi có thể thực hiện thành công tính năng này?
điềukhác Tôi đã thử đang đánh giá các dòng sau:
scalar(threads->list());
Nhưng điều đó mang lại cho tôi một giá trị kỳ lạ, giống như nó là một tài liệu tham khảo không được ban phước Tôi tin rằng trông giống như:
threads=SCALAR(0x80fea8c)
btw, đó là (stringification a) * may mắn * ref – ikegami
rất, rất BTW - Hãy nhớ rằng các chủ đề trong perl không giống như các chủ đề trong các ngôn ngữ lập trình khác - chúng rất thiếu tài nguyên, vì mỗi luồng có COPY của tất cả các biến.Chúng vẫn hữu ích trong một số trường hợp, nhưng trong mọi trường hợp tôi phải làm paralellization, forking hoạt động tốt hơn nhiều. Nó không liên quan trực tiếp đến câu hỏi của bạn, tôi chỉ muốn nói với bạn điều đó. :) –
Phiên bản nào của Perl? Phiên bản chủ đề nào? Và các chủ đề của bạn có tách rời (có lẽ tự tách trong mySubName) không? – pilcrow