2012-07-10 23 views
13

Tôi đã viết một tập lệnh sử dụng hai nhóm luồng gồm mười luồng mỗi luồng để lấy dữ liệu từ một API. Hồ bơi chủ đề thực hiện this code on ActiveState. Mỗi nhóm luồng sẽ theo dõi cơ sở dữ liệu Redis qua PubSub cho các mục nhập mới. Khi một mục mới được xuất bản, python chuyển dữ liệu đến một hàm sử dụng số Subprocess.POpen của python để thực thi một trình bao PHP để thực hiện công việc thực tế của việc gọi API.Kiểm soát ưu tiên lập lịch trình của các chuỗi python?

Hệ thống khởi chạy trình bao PHP này là cần thiết cho chức năng với ứng dụng web PHP của tôi, vì vậy không thể tránh khởi chạy các shell PHP bằng Python.

Tập lệnh này sẽ chỉ chạy trên máy chủ Linux.

Làm cách nào để kiểm soát niceness (ưu tiên lập lịch) của chuỗi của ứng dụng?

Edit:

Có vẻ như việc kiểm soát ưu tiên lập kế hoạch cho đề cá nhân bằng Python là không thể. Có một giải pháp python, hoặc ít nhất là một lệnh UNIX tôi có thể chạy cùng với kịch bản của tôi, để kiểm soát các ưu tiên?

Sửa 2:

Vâng, tôi đã không kết thúc việc tìm kiếm một cách python để xử lý nó. Tôi chỉ chạy kịch bản của tôi với đẹp bây giờ như thế này:

nice -n 19 python MyScript.py 

Trả lời

11

Tôi tin rằng ưu tiên luồng là không thể điều khiển trong python do cách thức chúng được thực hiện bằng cách sử dụng khóa phiên dịch toàn cầu (GIL). Có nói rằng, ngay cả khi bạn có thể cho một thread ưu tiên xử lý CPU hơn, việc thực hiện python mà xung quanh GIL sẽ không nhận thức được điều này khi nó đưa xung quanh GIL. Nếu bạn có thể tăng tính độc đáo trong một chủ đề trong hồ bơi của bạn (nói rằng nó đang làm một công việc quan trọng hơn), bạn sẽ cần phải sử dụng khóa thực hiện của riêng bạn để cấp quyền truy cập luồng ưu tiên cao hơn cho GIL thường xuyên hơn.

Một tìm kiếm google trả về bài viết này mà tôi tin là tương tự như những gì bạn đang yêu cầu

Giải thích lý do tại sao nó không làm việc http://www.velocityreviews.com/forums/t329441-threading-priority.html

Giải thích hiện giải pháp tôi đã gợi ý http://bytes.com/topic/python/answers/645966-setting-thread-priorities

+0

Cảm ơn câu trả lời! Tôi đã nhắc lại câu hỏi bây giờ hỏi làm thế nào tôi có thể thiết lập ưu tiên lịch trình cho ứng dụng như một toàn thể thay vì cá nhân. Điều đó vẫn nên đáp ứng nhu cầu của tôi. Tôi đã upvoted phản ứng của bạn và sẽ chọn bạn như là câu trả lời tốt nhất nếu tôi không nhận được bất kỳ phản ứng khác. – Backus

1

tôi đã tự hỏi nếu this answer at another related question có thể hữu ích trong trường hợp này không? (link)

Như bạn đã sử dụng Subprocess.POpen để khởi động kịch bản PHP của bạn, nó đập vào mắt tôi mà bạn có thể sử dụng "preexec_fn" và hoặc là một chức năng được xác định trước, hoặc một hàm lambda (như thể hiện trong câu trả lời liên kết ở trên) để thiết lập mức độ tốt đẹp của mỗi thread PHP được đưa ra?

2

Tôi biết, đã có rất nhiều thời gian trôi qua, nhưng gần đây tôi đã xem qua câu hỏi này và tôi nghĩ sẽ hữu ích khi thêm tùy chọn khác.

Có một cái nhìn tại threading2, mà là một thả trong thay thế và mở rộng cho mặc định luồng module, với sự hỗ trợ - loại - cho ưu tiên và mối quan hệ.

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