2012-10-12 13 views
5

System operacyjny nie spodoba się, jeśli używasz przetwarzania wieloprocesorowego i przypadkowo skończy się creating processes without limit.Zapobieganie wieloprocesorowym "budzącym się błędom"

Czy istnieje jakieś proste rozwiązanie, które temu zapobiega (np. Ograniczając całkowitą liczbę procesów w Pythonie lub w systemie operacyjnym)?

Używam systemu Windows, i zachowuje się bardzo źle (wymaga twardego restartu), gdy popełniam taki błąd. Więc bardzo bym chciał, jeśli jest jakiś kod, który mogę zawijać/dodać do mojej aplikacji i zapobiec temu.

+0

Jeśli to pytanie dotyczące systemu Windows - dlaczego jest oznaczony jako Linux? – tMC

+0

Idealne rozwiązanie dla systemu Linux i rozwiązanie dla systemu Windows! Przepraszam, nie miałem jasności co do tego ... Oczywiście 50% rozwiązanie jest nadal lepsze niż nic. – max

Odpowiedz

3

Co można zrobić, to utworzyć krótki moduł typu "trip-wire" i zaimportować go, jak również proces wieloprocesowy. Moduł trip-wire zgłosi wyjątek, jeśli wykryje nieskończoną pętlę wieloprocesową.

Kopalnia wygląda następująco:

#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' 

A w głównym pliku .py:

import mp_guard 
1

W systemie Linux można użyć systemu operacyjnego setrlimit(2) (z RLIMIT_NPROC), aby ograniczyć liczbę procesów (np. Aby uniknąć fork bombs). Ta syscall jest połączona z wbudowaną strukturą bash ulimit (lub zsh limit). Python ma około binding do tej syscall.

Nie mam pojęcia, czy coś podobnego istnieje pod Windows.

+1

O ile mogę powiedzieć, nic nie istnieje dla systemu Windows ... jest dla nich do bani :-( – ephemient

+0

Jeśli tak, to naprawdę jest do bani, nawet gdy system Windows przechodzi w tryb zamknięcia, wydaje się, że nie jest w stanie zatrzymać proliferacji procesów. myślę, że byłoby łatwo Win 7 blokować wszelkie nowe procesy tworzone przez użytkowników, gdy próbuje się zamknąć ... – max

+1

Linux nie cierpi z powodu tego problemu. –

1

Z okien można utworzyć "pracę", nie jestem ekspertem w Pythonie więc nie wiem, czy tam jest jakieś wiążące do tworzenia zadań systemu Windows. Funkcja API systemu Windows to CreateJobObject. Obiekt zadania jest (do pewnego stopnia) odpowiednikiem "grupy procesów" Unixa. Można zastosować pewne ograniczenia zarówno dla obiektu zadania jako całości, jak i dla każdego procesu oddzielnie (np. Maksymalne procesy w zadaniu). Można utworzyć obiekt zadania, przypisać do niego liczbę procesów, a następnie przypisać własny proces do obiektu zadania. Co może być szukasz jest CreateJobObject, SetInformationJobObject + JOBOBJECT_BASIC_LIMIT_INFORMATION + JOB_OBJECT_LIMIT_ACTIVE_PROCESS. Znowu: to jest Windows API, nie jestem pewien, czy masz jakieś "powiązania" z pytonem związanym z tymi funkcjami.

Powiązane problemy