2012-03-03 23 views
5

Tôi có một luồng làm nhiều quá trình xử lý chuyên sâu CPU, dường như đang chặn các luồng khác. Làm thế nào để hạn chế nó?Tôi có thể điều chỉnh các chuỗi Python bằng cách nào?

Tính năng này dành riêng cho web2py, nhưng giải pháp chung sẽ ổn.

+3

Có vẻ như cách cpu chuyên sâu một luồng là nguyên nhân chặn nó. Nhiều khả năng là bạn đang gặp sự cố với Khóa thông dịch toàn cục (http://wiki.python.org/moin/GlobalInterpreterLock). Bạn sẽ cần cung cấp thêm một số thông tin để chúng tôi có thể khắc phục tình huống. Chủ đề của bạn chính xác là gì? – Wilduck

+1

@Wilduck chủ đề chuyên sâu CPU có thể thêm độ trễ IO (mặc dù ít hơn trong một Python gần đây), xem phần này để minh hoạ: http://dabeaz.blogspot.com/2010/01/python-gil-visualized.html – Tobu

+0

@Wilduck chủ đề thực sự gọi mã trong JS. Tôi bị cám dỗ để thử và phát hành GIL (nếu nó không phải là đã) nhưng điều này sẽ buộc tôi phải chắc chắn rằng JS không cần GIL tại bất kỳ điểm nào ... Tôi có lẽ sẽ để lại nó cho thời điểm này và tìm cách giải quyết. – Chris

Trả lời

3

Tôi thực sự vừa mới đi sâu vào vấn đề này cách đây không lâu, bạn sẽ không thể thay đổi ưu tiên luồng nhưng có nhiều cách khác nhau.

Để cung cấp cho bạn một số thông tin cơ bản về vấn đề này, trong các chủ đề ràng buộc CPU cPython có thể khiến các luồng khác bị bỏ đói vì cách mà Global Interpreter Lock hoặc GIL được phát hành và mua lại. Điều kỳ lạ là vấn đề này trở nên tồi tệ hơn trong môi trường đa lõi. Phân tích và trình bày chi tiết thực sự về vấn đề này được thực hiện bởi David Beazley mà bạn có thể tìm thấy tại http://www.dabeaz.com/python/GIL.pdf. Anh ấy có một số bài đăng trên blog đi sâu vào chi tiết hơn. Chúng dài nhưng khá hấp dẫn.

Phiên bản ngắn gọn là luồng CPU bị ràng buộc phát hành và phản ứng lại GIL trước khi các chủ đề khác có thể được đánh thức để lấy nó. Kết quả trong chuỗi liên kết CPU giữ GIL trong hơn 90% thời gian.

Có một số mẫu mà bạn có thể sử dụng để khắc phục sự cố này. Ví dụ bạn có thể chạy các nhiệm vụ ràng buộc CPU của bạn trong một quá trình hoàn toàn khác. Điều này sẽ cho phép người lập lịch hệ điều hành quản lý việc chia sẻ tài nguyên tốt hơn và cho phép các chủ đề web2py của bạn tiếp tục chạy vì các hệ điều hành thực sự ưu tiên cho các luồng IO bị ràng buộc. Thư viện multiprocessing được cung cấp cho các trường hợp như thế này. Nó sẽ yêu cầu một số mã hơn để làm cho nó hoạt động nhưng điều đó sẽ giúp ích.

+0

Xử lý đa hình giống như một lựa chọn có thể, nhờ @ William-- – Chris

1

Bạn đang sử dụng phiên bản Python nào? Trong 3.2, the GIL was changed to yield after fixed timeslices rather than after a certain number of high-level opcodes. Ngay cả với thay đổi đó, việc chạy mã chuyên sâu CPU có thể ảnh hưởng đến độ trễ của ứng dụng web của bạn (và ngược lại, phần nhạy cảm với IO sẽ ngăn phần CPU chuyên sâu chiếm toàn bộ lõi). Bạn chỉ cần tắt nhiệm vụ cho các quy trình công nhân bằng cách sử dụng một hàng đợi như beanstalkd, và để cho bộ lập lịch hệ điều hành làm việc của nó.

+0

Tôi nghĩ rằng GIL mới chỉ ở mức 3.2. Họ đang thực sự làm việc để cải thiện nó hơn nữa trong 3.3 http://bugs.python.org/issue7946 Thật không may là hỗ trợ python 3 trong các khung công tác web chỉ mới bắt đầu được thực hiện. Tôi chưa nghe nói về một người ổn định. – William

+0

@William cảm ơn, đã sửa chữa. [Linh hồn dũng cảm sẽ tìm thấy một backport ở đây.] (Http://bugs.python.org/issue7753) – Tobu

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