2013-02-20 21 views
5

Tôi chỉ đang tìm kiếm về triển khai mới này và tôi sử dụng python 2.7, tôi phải cài đặt this, vì vậy nếu tôi sử dụng nó, tôi sẽ quên từ GIL trên CPython?Có đồng thời.futures một loại thuốc của GIL?

+1

http://www.dalkescientific.com/writings/diary/archive/2012/01/19/concurrent.futures.html –

+1

http://docs.python.org/dev/library/concurrent.futures.html # module-concurrent.futures - Không đề cập đến bất cứ điều gì về GIL, do đó, các chủ đề nó sử dụng có vẻ là chủ đề đúng. Nếu không, tại sao bận tâm với tất cả các hulabaloo này? –

+0

Tôi đã tìm thấy mã không đồng bộ yêu thích sử dụng concurrent.futures, vì vậy tôi đã nói rằng đó là một medecine cho GIL –

Trả lời

12

Không, concurrent.futures hầu như không liên quan gì đến GIL.

Sử dụng quy trình thay vì chuỗi là thuốc cho GIL. (Tất nhiên, giống như tất cả các loại thuốc, nó có tác dụng phụ. Nhưng nó có tác dụng.)

Mô-đun futures chỉ cung cấp cho bạn cách đơn giản hơn để lên lịch và chờ đợi công việc hơn là sử dụng trực tiếp threading hoặc multiprocessing. Và nó có thêm lợi thế mà bạn có thể trao đổi giữa một hồ bơi thread và một hồ bơi quá trình (và thậm chí một vòng lặp greenlet, hoặc một cái gì đó điên bạn phát minh và xây dựng) mà không thay đổi mã future. Vì vậy, nếu bạn không biết liệu mã của bạn sẽ có vấn đề GIL, bạn có thể xây dựng nó để sử dụng các chủ đề, và sau đó chuyển đổi nó để sử dụng các quy trình với một thay đổi một dòng, mà là khá tốt đẹp.

Tuy nhiên, nếu bạn sử dụng ThreadPoolExecutor, nó sẽ có cùng một vấn đề GIL giống như khi bạn tạo nhóm chủ đề, hàng công việc, v.v. theo cách thủ công với threadingqueue. Nếu bạn sử dụng ProcessPoolExecutor, nó sẽ tránh các vấn đề GIL theo cùng một cách (và với cùng một sự cân bằng) như thể bạn đã sử dụng multiprocessing theo cách thủ công.

Và gói PyPI chỉ là một cổng sau đơn giản của mô-đun concurrent.futures từ 3,2 đến 2,x (và 3,0-3,1). (Nó không kỳ diệu cho bạn mới-and-loại-of-cải thiện 3,2 GIL, hoặc càng được cải thiện 3,3 GIL, ít hơn nhiều loại bỏ các GIL.)


tôi có lẽ không nên thậm chí có đề cập đến những thay đổi của GIL, bởi vì điều này dường như đã thêm vào sự nhầm lẫn ... nhưng bây giờ, hãy để tôi cố gắng làm thẳng nó ra, bằng cách đơn giản hóa quá mức.

Nếu bạn không có gì ngoài công việc liên quan đến IO, chủ đề là cách tuyệt vời để có được sự đồng thời, lên đến giới hạn hợp lý. Và 3,3 làm cho chúng hoạt động tốt hơn - nhưng đối với hầu hết các trường hợp, 2.7 đã đủ tốt, và, đối với hầu hết các trường hợp không phải vậy, 3,3 vẫn chưa đủ tốt. Nếu bạn muốn xử lý 10000 khách hàng đồng thời, bạn sẽ muốn sử dụng vòng lặp sự kiện (ví dụ: twisted, tornado, gevent, tulip, v.v.) thay vì chuỗi.

Nếu bạn có bất kỳ công việc nào bị ràng buộc CPU, chủ đề không giúp song song công việc đó. Trong thực tế, họ làm cho mọi thứ tồi tệ hơn. 3.3 làm cho hình phạt đó không phải là khá xấu, nhưng nó vẫn là một hình phạt, và bạn vẫn không bao giờ nên làm điều này. Nếu bạn muốn song song với công việc của CPU, bạn phải sử dụng các tiến trình chứ không phải các luồng. Ưu điểm duy nhất của 3.3 là futures dễ sử dụng hơn multiprocessing và được tích hợp sẵn thay vì cần phải cài đặt.

Tôi không muốn khuyến khích bạn chuyển sang 3.3, vì đó là triển khai tốt hơn ngôn ngữ tốt hơn 2.7. Nhưng đồng thời tốt hơn không phải là một lý do để di chuyển.

+0

vì vậy chúng là những thứ khác nhau! đó là GIL đã được viết lại trên 3.2 rằng tôi có vẻ như đó là concurrent.futures giải quyết vấn đề, cảm ơn bạn :) –

+2

@AbdelouahabPp: Không, 'concurrent.futures' không _not_ giải quyết bất kỳ vấn đề nào, ngoại trừ vấn đề tạo ra mã đồng thời hơi đơn giản hơn để viết. Những thay đổi đối với GIL trong 3.2 và 3.3 là hoàn toàn độc lập, và nó chỉ là một sự trùng hợp ngẫu nhiên mà thay đổi GIL quan trọng đầu tiên trong hơn một thập kỷ đến cùng phiên bản Python như thư viện 'tương lai '. – abarnert

+0

vì vậy tôi nên chuyển sang 3.3 nếu tôi muốn nhận được mã đồng thời tuyệt vời! cảm ơn bạn :) và xin lỗi vì chủ đề này tôi sẽ trở lại cho nó serveral lần để có được nhiều hơn ý tưởng, là một người mới bắt đầu, và tìm thấy thư viện này với Tornado –

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