2013-08-28 10 views
6

Uczę się, jak korzystać z biblioteki wieloprocesorowej Python. Jednakże, podczas gdy przechodzę niektóre przykłady, zakończyłem z wieloma procesami Pythona działającymi w moim tle.Python Multiprocessing Kill Processes

Jednym z example wygląda jak poniżej:

from multiprocessing import Process, Lock 

def f(l, i): 
    l.acquire() 
    print 'hello world', i 
    l.release() 

if __name__ == '__main__': 
    lock = Lock() 

    for num in range(10): # I changed the number of iterations from 10 to 1000... 
     Process(target=f, args=(lock, num)).start() 

Teraz tutaj jest zrzut ekranu z mojego polecenia 'top':

88950 Python  0.0 00:00.00 1 0 9  91 1584K 5856K 2320K 1720K 2383M 82441 1  sleeping 1755113321 799 
88949 Python  0.0 00:00.00 1 0 9  91 1584K 5856K 2320K 1720K 2383M 82441 1  sleeping 1755113321 798 
88948 Python  0.0 00:00.00 1 0 9  91 1580K 5856K 2316K 1716K 2383M 82441 1  sleeping 1755113321 797 
88947 Python  0.0 00:00.00 1 0 9  91 1580K 5856K 2316K 1716K 2383M 82441 1  sleeping 1755113321 796 
88946 Python  0.0 00:00.00 1 0 9  91 1576K 5856K 2312K 1712K 2383M 82441 1  sleeping 1755113321 795 
88945 Python  0.0 00:00.00 1 0 9  91 1576K 5856K 2312K 1712K 2383M 82441 1  sleeping 1755113321 794 
88944 Python  0.0 00:00.00 1 0 9  91 1576K 5856K 2312K 1712K 2383M 82441 1  sleeping 1755113321 794 
88943 Python  0.0 00:00.00 1 0 9  91 1572K 5856K 2308K 1708K 2383M 82441 1  sleeping 1755113321 792 
88942 Python  0.0 00:00.00 1 0 9  91 1568K 5856K 2304K 1708K 2383M 82441 1  sleeping 1755113321 790 
88941 Python  0.0 00:00.00 1 0 9  91 1564K 5856K 2300K 1704K 2383M 82441 1  sleeping 1755113321 789 
88938 Python  0.0 00:00.00 1 0 9  91 1564K 5856K 2300K 1704K 2383M 82441 1  sleeping 1755113321 788 
88936 Python  0.0 00:00.00 1 0 9  91 1576K 5856K 2296K 1716K 2383M 82441 1  sleeping 1755113321 787 
88935 Python  0.0 00:00.00 1 0 9  91 1560K 5856K 2296K 1700K 2383M 82441 1  sleeping 1755113321 787 
88934 Python  0.0 00:00.00 1 0 9  91 1560K 5856K 2296K 1700K 2383M 82441 1  sleeping 1755113321 786 
88933 Python  0.0 00:00.00 1 0 9  91 1556K 5856K 2292K 1696K 2383M 82441 1  sleeping 1755113321 785 
88932 Python  0.0 00:00.00 1 0 9  91 1556K 5856K 2292K 1696K 2383M 82441 1  sleeping 1755113321 784 
88931 Python  0.0 00:00.00 1 0 9  91 1552K 5856K 2288K 1692K 2383M 82441 1  sleeping 1755113321 783 
88930 Python  0.0 00:00.00 1 0 9  91 1612K 5856K 2288K 1752K 2383M 82441 1  sleeping 1755113321 783 
88929 Python  0.0 00:00.00 1 0 9  91 1588K 5856K 2288K 1728K 2383M 82441 1  sleeping 1755113321 782 
88927 Python  0.0 00:00.00 1 0 9  91 1608K 5856K 2284K 1748K 2383M 82441 1  sleeping 1755113321 781 
88926 Python  0.0 00:00.00 1 0 9  91 1548K 5856K 2284K 1688K 2383M 82441 1  sleeping 1755113321 780 
88924 Python  0.0 00:00.00 1 0 9  91 1556K 5856K 2276K 1700K 2383M 82441 1  sleeping 1755113321 778 
88923 Python  0.0 00:00.00 1 0 9  91 1540K 5856K 2276K 1684K 2383M 82441 1  sleeping 1755113321 777 
88922 Python  0.0 00:00.00 1 0 9  91 1540K 5856K 2276K 1684K 2383M 82441 1  sleeping 1755113321 776 
88921 Python  0.0 00:00.00 1 0 9  91 1536K 5856K 2272K 1680K 2383M 82441 1  sleeping 1755113321 774 
88920 Python  0.0 00:00.00 1 0 9  91 1528K 5856K 2264K 1672K 2383M 82441 1  sleeping 1755113321 771 
88919 Python  0.0 00:00.00 1 0 9  91 1528K 5856K 2264K 1672K 2383M 82441 1  sleeping 1755113321 771 
88918 Python  0.0 00:00.00 1 0 9  91 1528K 5856K 2264K 1672K 2383M 82441 1  sleeping 1755113321 770 
.... 
  1. nie wiem jak zabić je za jednym razem.

    ps ... | grep python .... kill?

  2. jakiego rodzaju kodu Pythona trzeba dodać, aby ponownie uniknąć tej nieszczęśliwej sytuacji. Dzięki!

Odpowiedz

3

Trzeba .join() na swoich procesów w pracownika kolejce, która zablokuje je do aplikacji wywołującej aż wszystkie z nich uda lub zabić, gdy rodzic zostaje zabity, i uruchomić je w trybie demona.

http://forums.xkcd.com/viewtopic.php?f=11&t=94726

end daemon processes with multiprocessing module

http://docs.python.org/2/library/multiprocessing.html#the-process-class

http://www.python.org/dev/peps/pep-3143/#correct-daemon-behaviour

+1

Kod "powinieneś ...", aby uniknąć tego ponownie, prawda? Czy wiesz, jak zabić wszystkie procesy generowane przez wieloprocesorowość? –

5

Odpowiedź wskazał Blake VandeMerwe jest wymieniona i opisana poniżej nadziei może być pomocne dla innych użytkowników:

Original Author:

kill -9 `ps -ef | grep test.py | grep -v grep | awk '{print $2}'` 

wyjaśnieniu:

  1. "ps -ef": pokazuje wszystkie procesy w tym te bez zacisków sterujących, które są dokładnie niezliczone procesy generowane przez Multiprocessing bibliotekę.

  2. "grep test.py": znajdź wszystkie procesy wygenerowane przez ten skrypt, który jest nazwą mojego skryptu Pythona.

  3. "grep -v grep": wyłączone działanie grep sobie z 'listy zabijanie'

  4. "awk '{print $ 2}'": za pomocą awk oddzielić każdy rekordy w rzędzie i wydrukować drugi wiersz, który w tym przypadku jest identyfikatorem procesu.

  5. "Zabij -9" jest procesem wymuszenia siły, argumenty powinny być UID. Pełne wyniki poprzednich kroków są zestawiane razem przez "` ", czyli po lewej stronie cyfry 1 na zwykłej klawiaturze. traktują je jako zmienną i przekazują wartość do zabicia.

+1

-1. Nie! [Nie rób] (http: //unix.stackexchange.com/q/8916/20714) [just] (http://partmaps.org/era/unix/award.html#uuk9letter) ['SIGKILL'] (https://en.wikipedia.org/wiki/Unix_signal# SIGKILL) [pierwszy!] (Http://superuser.com/a/137400/144700) –

Powiązane problemy