Nếu bạn muốn tìm hiểu cách để sử dụng chuỗi trình thông dịch Perl, có tài liệu tốt ở perlthrtut
(threads tutorial) và the threads
pragma manpage. Nó chắc chắn là đủ tốt để viết một số kịch bản đơn giản.Trường hợp sử dụng cho ithreads (chủ đề thông dịch viên) trong Perl và lý do để sử dụng hoặc không sử dụng chúng?
Tuy nhiên, tôi đã tìm thấy hướng dẫn nhỏ trên web trên lý do tại sao và những gì sử dụng hợp lý các chuỗi phiên dịch của Perl. Trong thực tế, không có nhiều cuộc nói chuyện về họ, và nếu mọi người nói về họ, nó khá thường xuyên để ngăn cản mọi người sử dụng chúng.
Những chủ đề, có sẵn khi perl -V:useithreads
là useithreads='define';
và tung ra bởi use threads
, còn được gọi là ithreads, và có lẽ thích hợp hơn như vậy là họ rất khác biệt so với các chủ đề như được cung cấp bởi hệ điều hành Linux hoặc Windows hoặc máy ảo Java trong rằng không có gì được chia sẻ theo mặc định và thay vào đó rất nhiều dữ liệu được sao chép, không chỉ ngăn xếp luồng, do đó làm tăng đáng kể kích thước quy trình. (Để xem hiệu ứng, tải một số module trong một kịch bản kiểm tra, sau đó tạo ra chủ đề trong một vòng lặp dừng lại cho ép chính mỗi lần xung quanh, và xem tăng bộ nhớ trong task manager hoặc top
.)
[...] mỗi khi bạn bắt đầu một luồng, tất cả các cấu trúc dữ liệu được sao chép vào chuỗi mới. Và khi tôi nói tất cả, ý tôi là tất cả. Ví dụ: bao gồm stashes gói, biến toàn cục, từ vựng trong phạm vi. Mọi điều!
- Things you need to know before programming Perl ithreads (Perlmonks 2003)
Khi nghiên cứu đề tài của ithreads Perl, bạn sẽ thấy mọi người ngăn cản bạn sử dụng chúng ("extremely bad idea", "fundamentally flawed", hoặc "never use ithreads for anything").
The Perl thread tutorial highlights that "Perl Threads Are Different", nhưng không cần phải giải thích cách chúng khác nhau và điều đó có ý nghĩa gì đối với người dùng.
Một lời giải thích hữu ích nhưng rất ngắn gọn về những gì ithreads thực sự là from the Coro
manpage under the heading WINDOWS PROCESS EMULATION. Tác giả của mô-đun đó (Coro - các chủ đề thực sự duy nhất trong perl) cũng không khuyến khích sử dụng các trình thông dịch Perl.
Một nơi nào đó tôi đọc rằng biên dịch perl với các luồng được bật sẽ dẫn đến trình thông dịch chậm hơn đáng kể.
Có một trang Perlmonks từ năm 2003 (Things you need to know before programming Perl ithreads), trong đó tác giả hỏi: "Bây giờ bạn có thể băn khoăn tại sao các ithreads Perl không sử dụng fork()? Điều đó có ý nghĩa hơn không?" Điều này dường như đã được viết bởi tác giả của pragma forks
. Bạn không chắc chắn thông tin được cung cấp trên trang đó vẫn giữ đúng vào năm 2012 cho các Perls mới hơn.
Dưới đây là một số hướng dẫn để sử dụng các chủ đề trong Perl tôi đã chắt lọc từ bài đọc của tôi (có thể sai lầm như vậy):
- Xem xét sử dụng non-blocking IO thay vì đề, giống như với
HTTP::Async
, hoặcAnyEvent::Socket
, orCoro::Socket
. - Cân nhắc sử dụng chủ đề thông dịch Perl on Windows only, not on UNIX because on UNIX, forks are more efficient both for memory and execution speed.
- Tạo chủ đề ở đầu chương trình, chứ không phải khi mức độ thiếu bộ nhớ đã đáng kể - xem "ideal way to reduce these costs" in
perlthrtut
. - Giảm thiểu giao tiếp giữa các chủ đề because it's slow (tất cả câu trả lời trên trang đó).
Cho đến nay nghiên cứu của tôi. Bây giờ, cảm ơn cho bất kỳ ánh sáng hơn bạn có thể đổ về vấn đề này của chủ đề trong Perl. Một số trường hợp sử dụng hợp lý cho ithreads trong Perl là gì? Lý do để sử dụng hoặc không sử dụng chúng là gì?
Cảm ơn! Đây là hướng dẫn sử dụng chi tiết nhất cho các chủ đề của Perl mà tôi đã thấy cho đến nay. - Trong câu hỏi của tôi, tôi đã nói rằng * cách * sử dụng ithreads được bao phủ trong khi * tại sao * và * những gì cho * thiếu. Suy nghĩ thêm về điều này, * how *, the * why *, và * what for * liên quan chặt chẽ, và thực sự * cách * không đủ chính xác (đối với những người dùng Perl thông thường như tôi) để trả lời * tại sao * và * cái gì cho *. - Câu trả lời này là một bước tiến. Cảm ơn một lần nữa. – Lumi
"Chúng vẫn tốt hơn chủ đề của Python." - Bạn có thể giải thích điều này? Xin vui lòng, nó rất intresting – nordicdyno
Chủ yếu là nó về GIL Python trong hầu hết các triển khai (chủ yếu là cpython nhưng những người khác để ít hơn extents). Về cơ bản, nó có nghĩa là các luồng hệ điều hành trên Python không thể thực thi đồng thời công việc của CPU - điều này hoàn toàn đánh bại điểm của chúng. Bạn có thể sử dụng chúng (các chủ đề Python) để làm cho I/O đồng bộ hơn một chút, nhưng nó đơn giản hơn để sử dụng các API hướng sự kiện để làm điều đó. –