2012-09-21 34 views
6

Perl's documentation nói: Kể từ Perl 5.8, lập trình chủ đề đã sẵn sàng sử dụng một mô hình gọi là bài dịch mà cung cấp một thông dịch Perl mới cho mỗi threadHệ thống luồng của Perl hoạt động như thế nào?

Sử dụng ps -Lm <pid> với chương trình dưới đây, tôi có thể thấy rằng đề chạy song song , tức là, chúng đang được chạy cùng lúc với các lõi khác nhau. Nhưng ngay cả khi có 4 chủ đề (3 và chính) ps aux chỉ hiển thị một quy trình Perl.

  1. Điều này có nghĩa rằng có một toàn bộ thông dịch Perl trên mỗi thread?
  2. Are Chủ đề Perl ánh xạ tới chủ đề hệ thống?
  3. Nếu 2 là đúng, làm cách nào để có thể có nhiều thông dịch viên Perl trong một quy trình?
use threads; 

$thr = threads->new(\&sub1); 
$thr2 = threads->new(\&sub1); 
$thr3 = threads->new(\&sub1); 

sub sub1 { 
     $i = 0; 
     while(true){ 
     $i = int(rand(10)) + $i; 
     } 
} 


$thr->join; 
+0

http://stackoverflow.com/questions/9973860/use-cases-for-ithreads-interpreter-threads-in-perl-and-rationale-for-using-or – user454322

+2

Tôi đặc biệt khuyên bạn đọc [this] (http://www.perlmonks.org/index.pl?node_id=288022) trước khi sử dụng "chủ đề Perl" trong bất kỳ dự án nào .. – PSIAlt

+0

Hơn nữa trong ghi chú phát hành perl 5.20: Chủ đề dựa trên phiên dịch hiện không được khuyến khích "Trình thông dịch- chủ đề dựa trên "do Perl cung cấp không phải là hệ thống nhanh, nhẹ cho đa nhiệm mà người ta có thể mong đợi hoặc hy vọng. Các luồng được thực hiện theo cách khiến chúng dễ bị lạm dụng. Rất ít người biết cách sử dụng chúng một cách chính xác hoặc sẽ có thể cung cấp trợ giúp. – Rob11311

Trả lời

10

"thông dịch Perl" đề cập đến môi trường, trong đó các mã Perl thực hiện. Từ quan điểm của người dùng, đó chủ yếu là bảng biểu tượng và hình cầu trong đó, nhưng nó cũng bao gồm một loạt các biến nội bộ (ví dụ: các biến được sử dụng trong quá trình phân tích cú pháp, op hiện tại, v.v.).

  1. Có, có một thông dịch viên Perl cho mỗi chuỗi.

  2. Có, chủ đề Perl là chuỗi hệ thống.

  3. Hãy suy nghĩ về "thông dịch viên Perl" làm lớp mà bạn có thể thực hiện bất kỳ số lượng phiên bản nào. * Perl đề cập đến điều này là Multiplicity. Xem perlembed để biết cách nhúng trình thông dịch Perl vào ứng dụng của bạn.


* — Đòi hỏi việc sử dụng các -Dusemulitplicity khi xây dựng Perl, được ngụ ý bởi -Dusethreads, đó là cách hỗ trợ chủ đề sẽ được thêm vào Perl. Nếu không, toàn bộ một loạt các hình cầu được sử dụng thay vì một "lớp".

6

Để khuếch đại câu trả lời của ikegami cho câu hỏi thứ ba của bạn, Perl tạo bản sao hoàn chỉnh toàn bộ trạng thái của trình thông dịch cho từng chuỗi hệ điều hành. Điều này có nghĩa là tất cả dữ liệu và mã được sao chép. Về phía xuống, điều này làm cho việc tạo ra các chủ đề chậm và chủ đề Perl là bộ nhớ đói.

Ở phía trên, các chuỗi được tách biệt với nhau giúp dễ dàng viết mã an toàn luồng hơn. Ví dụ, hầu hết các mô-đun vốn đã được an toàn chủ đề mà không có tác giả phải làm bất cứ điều gì đặc biệt hoặc suy nghĩ về chủ đề ở tất cả.

Đây là lần triển khai chuỗi thứ hai của Perl. Các chủ đề đầu tiên, 5,005, là một mô hình luồng truyền thống hơn, nơi các luồng được chia sẻ mã và các biến toàn cầu. Nó không hoạt động tốt lắm. Tồi tệ hơn, nó trả về hầu hết các mô-đun CPAN vô dụng khi các biến toàn cầu không liên kết của chúng va chạm với nhau giữa các luồng khác nhau.

Làm thế nào có thể là một điều được gọi là "đa dạng" mà ikegami đã đề cập và giải thích. Điều này ban đầu xuất hiện từ mong muốn nhúng một thông dịch viên Perl vào một chương trình C hoặc C++ khác. Nó đòi hỏi phải thay đổi cách Perl hoạt động để nó tách biệt tất cả các dữ liệu toàn cầu của nó (các biến toàn cục và mã được biên dịch) cho mỗi đối tượng thông dịch, thay vì giả sử trình thông dịch Perl duy nhất của nó đang chạy trong tiến trình. Từ đó, nhiều thông dịch viên Perl trong một thông dịch viên Perl, được sử dụng để mô phỏng fork trên Windows. Cuối cùng, 5.6 chủ đề được xây dựng trên đầu trang của công việc mở rộng đó.

Các vấn đề liên quan