2015-09-28 26 views
5

Dựa trên sự hiểu biết của tôi, các luồng không thể được thực thi song song (được thực thi dựa trên tính khả dụng và ngẫu nhiên) và đó là lý do Eventlet đang được sử dụng.Python Multiprocessing vs Eventlet

Nếu Eventlets là nhiều hơn cho song song lý do tại sao chúng ta không thể chỉ sử dụng mô-đun đa xử lý của Python.

Tôi đã nghĩ đến việc thực thi nhiều mô-đun quy trình và sử dụng phương thức kết nối() để kiểm tra xem tất cả quy trình đã hoàn tất chưa.

Ai đó có thể giải thích nếu hiểu biết của tôi là chính xác không?

+1

Tôi có thể bị đe doạ sai, nhưng từ những gì tôi đọc của Eventlet (không bao giờ nghe nói về nó trước đó, cảm ơn bạn đã gợi ý) nó thực hiện không chặn IO, do đó cho phép luồng thực hiện chuyển từ hành động này sang hành động tiếp theo trong hồ bơi. Vâng, mặc dù nó là chủ đề đúng trong CPython không chạy song song do GIL, các thread tiếp theo có thể chạy trong khi một trong những bị chặn trên một hoạt động IO. Vì vậy, trong lý thuyết không nên có nhiều sự khác biệt (ngoài việc dễ lập trình). Bất cứ ai có thể vui lòng xác nhận/sửa tàu của tôi suy nghĩ? – Pynchia

Trả lời

0

Dựa trên sự hiểu biết của tôi, chủ đề không thể được thực hiện song song (thực hiện dựa trên tính sẵn sàng và ngẫu nhiên)

Đúng

và thats lý do Eventlet đang được sử dụng.

Không đúng. Thư viện Eventlet được sử dụng để đơn giản hóa lập trình IO không chặn. Nó không thực sự thêm tính song song. Việc thực hiện luồng vẫn được giới hạn trong một luồng tại một thời điểm do GIL. Nhưng nó được sử dụng bởi vì nó đơn giản hóa rất nhiều quá trình khởi chạy, lên lịch và quản lý các luồng liên kết IO, đặc biệt là các luồng không cần tương tác với nhau.

Nếu Eventlets được nhiều hơn cho xử lý song song

Như tôi vừa nói, đây không phải là những gì họ tồn tại cho.

tại sao chúng ta không thể sử dụng mô-đun đa xử lý của Python. Tôi nghĩ về việc thực hiện các mô-đun quá trình đa và sử dụng phương thức kết nối() để kiểm tra xem tất cả các quá trình đã hoàn tất chưa.

Bạn chắc chắn có thể! Và bạn sẽ nhận được thực thi song song thực tế với phương pháp này. Nhưng bạn có thể không nhận được cùng một tốc độ. Thư viện đa xử lý phù hợp hơn với các nhiệm vụ song song với CPU, bởi vì đó là những nhiệm vụ cần truy cập thường xuyên hơn vào trình thông dịch. Bạn thực sự có thể thấy sự gia tăng trong thời gian thực thi khi sử dụng đa xử lý với các nhiệm vụ liên kết với IO vì chi phí của việc thực thi và quản lý nhiều quy trình.


Như trường hợp với hầu hết các câu hỏi về tối ưu hóa và thực thi, hãy thử cả hai và định hình là cách chắc chắn để đảm bảo bạn đang sử dụng tùy chọn "tốt nhất" cho ứng dụng của mình. Mặc dù bạn có thể thấy rằng nếu bạn viết mã để sử dụng Eventlets trước, sau đó cố gắng sửa đổi nó để sử dụng các luồng thông thường hoặc đa xử lý, bạn sẽ phải viết thêm mã boilerplate để quản lý các luồng hoặc các quy trình và giá trị của Eventlets trở nên rõ ràng hơn.

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