2012-10-12 38 views
5

Hệ điều hành sẽ không thích nếu bạn sử dụng đa xử lý và vô tình kết thúc creating processes without limit.Ngăn chặn đa xử lý "lỗi chạy"

Có bất kỳ giải pháp đơn giản nào ngăn điều này xảy ra không (giả sử bằng cách giới hạn tổng số quy trình, bằng Python hoặc trong hệ điều hành)?

Tôi sử dụng Windows và ứng dụng hoạt động thực sự tồi tệ (yêu cầu khởi động lại cứng) khi tôi phạm sai lầm như vậy. Vì vậy, tôi rất thích nó nếu có một số mã mà tôi có thể quấn quanh/thêm vào ứng dụng của tôi và ngăn chặn điều này xảy ra.

+0

Nếu đây là cửa sổ câu hỏi - tại sao thẻ được gắn thẻ Linux? – tMC

+0

Bởi vì lý tưởng tôi muốn có một giải pháp cho Linux và một giải pháp cho Windows! Xin lỗi tôi đã không rõ ràng về nó ... Rõ ràng là một giải pháp 50% vẫn còn tốt hơn không có gì. – max

Trả lời

3

Những gì bạn có thể làm là tạo mô-đun loại 'chuyến đi dây' ngắn và nhập mô-đun cũng như đa xử lý. Mô-đun dây dẫn chuyến đi sẽ tăng ngoại lệ nếu nó phát hiện một vòng lặp vô hạn đa xử lý.

Mine trông như thế này:

#mp_guard.py 
"""tracks invocation by creating an environment variable; if that 
variable exists when next called a loop is in progress""" 

import os 

class Brick(Exception): 
    def __init__(self): 
     Exception.__init__(self, "Your machine just narrowly avoided becoming" 
           " a brick!") 

if 'MP_GUARD' in os.environ: 
    raise Brick 

os.environ['MP_GUARD'] = 'active' 

Và trong file py chính:

import mp_guard 
1

Trên Linux, bạn có thể sử dụng tòa nhà chọc trời setrlimit(2) (với RLIMIT_NPROC) để giới hạn số lượng quy trình (ví dụ: tránh fork bombs). Syscall này được giao tiếp thông qua các bash ulimit (hoặc zsh limit) được xây dựng. Python có một số binding đến syscall này.

Tôi không biết có điều gì tương tự tồn tại trong Windows hay không.

+1

Theo như tôi có thể nói, không có gì tồn tại cho Windows ... hút cho họ :-( – ephemient

+0

Nếu vậy, nó thực sự hút ngay cả khi Windows đi vào chế độ tắt máy, có vẻ như không thể ngừng sự gia tăng của các quy trình. nghĩ rằng nó sẽ dễ dàng cho Win 7 để chặn bất kỳ quy trình mới do người dùng tạo khi nó cố gắng tắt ... – max

+1

Linux không gặp phải vấn đề này. –

1

Trên cửa sổ bạn có thể tạo ra "một công việc", tôi không phải là một chuyên gia trong python, vì vậy tôi không biết nếu theres là bất kỳ ràng buộc cho việc tạo cửa sổ công việc. Chức năng API Windows là CreateJobObject. Một đối tượng công việc là (ở một mức độ nào đó) tương đương với "nhóm tiến trình" Unix. Bạn có thể áp dụng một số giới hạn nhất định trên cả đối tượng công việc nói chung và cho từng quy trình riêng biệt (ví dụ: các quy trình tối đa trong công việc). Bạn có thể tạo một đối tượng công việc, gán số lượng các quy trình giới hạn cho nó và sau đó gán quy trình của riêng bạn cho đối tượng công việc. Những gì bạn có thể tìm kiếm là CreateJobObject, SetInformationJobObject + JOBOBJECT_BASIC_LIMIT_INFORMATION + JOB_OBJECT_LIMIT_ACTIVE_PROCESS. Một lần nữa: đây là Windows API, tôi không chắc chắn nếu bạn có bất kỳ 'bindings' để python liên quan đến các chức năng này.

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