Tôi hơi bối rối về việc liệu đa luồng có hoạt động trong Python hay không.
Tôi biết đã có rất nhiều câu hỏi về vấn đề này và tôi đã đọc nhiều câu hỏi trong số đó, nhưng tôi vẫn bối rối. Tôi biết từ kinh nghiệm của chính mình và đã thấy những người khác đăng câu trả lời và ví dụ của riêng họ ở đây trên StackOverflow rằng đa luồng thực sự có thể thực hiện được trong Python. Vậy tại sao mọi người cứ nói rằng Python bị GIL khóa và chỉ có một luồng có thể chạy tại một thời điểm? Nó rõ ràng hoạt động. Hay có sự khác biệt nào đó mà tôi không hiểu ở đây?
Nhiều người đăng / người trả lời cũng đề cập đến việc phân luồng bị hạn chế vì nó không tận dụng được nhiều lõi. Nhưng tôi muốn nói rằng chúng vẫn hữu ích vì chúng hoạt động đồng thời và do đó hoàn thành khối lượng công việc tổng hợp nhanh hơn. Ý tôi là tại sao thậm chí sẽ có một mô-đun chuỗi Python nếu không?
Cập nhật:
Cảm ơn cho tất cả các câu trả lời cho đến nay. Theo cách hiểu của tôi là đa luồng sẽ chỉ chạy song song đối với một số tác vụ IO, nhưng chỉ có thể chạy từng tác vụ một đối với nhiều tác vụ lõi có giới hạn CPU.
Tôi không hoàn toàn chắc chắn điều này có ý nghĩa gì đối với tôi về mặt thực tế, vì vậy tôi sẽ chỉ đưa ra một ví dụ về loại nhiệm vụ mà tôi muốn đa luồng. Ví dụ: giả sử tôi muốn lặp qua một danh sách rất dài các chuỗi và tôi muốn thực hiện một số thao tác chuỗi cơ bản trên mỗi mục danh sách. Nếu tôi chia nhỏ danh sách, gửi từng danh sách con để được xử lý bởi mã vòng lặp / chuỗi của tôi trong một chuỗi mới và gửi lại kết quả trong một hàng đợi, liệu các khối lượng công việc này có chạy gần như cùng một lúc không? Quan trọng nhất về mặt lý thuyết, điều này có tăng tốc thời gian chạy script không?
Một ví dụ khác có thể là nếu tôi có thể kết xuất và lưu bốn hình ảnh khác nhau bằng cách sử dụng PIL trong bốn luồng khác nhau và điều này có nhanh hơn xử lý từng hình ảnh một không? Tôi đoán thành phần tốc độ này là điều tôi thực sự băn khoăn hơn là thuật ngữ chính xác là gì.
Tôi cũng biết về mô-đun đa xử lý nhưng mối quan tâm chính của tôi bây giờ là tải tác vụ từ nhỏ đến trung bình (10-30 giây) và vì vậy tôi nghĩ đa luồng sẽ thích hợp hơn vì các quá trình con có thể khởi động chậm.