środa, października 10, 2012

Python zabójca ;-) czyli krótka opowieść o tym jak multiprocess "zabił" komputer ;-)

Wierzenie Internetowi może boleć ;-)
Skarżyłem się na problemy z multiprocessing'iem w Pythonie. Już rozumiem dlaczego je miałem ;-)

Chyba na StackOverflow czy czymś podobnym przeczytałem poradę dla kogoś narzekającego na GILa, że niech użyje multiprocessing, bo ma to to taki sam interfejs jak threading i powinno działać.
Więc programik:

import threading

class MyThread(threading.Thread):
def run(self):
i = 0
while True:
i=i+1
print threading.current_thread(),i

for i in range(0,8):
p = MyThread()
p.start()

Zmieniłem w:

import multiprocessing

class MyThread(multiprocessing.Process):
def run(self):
i = 0
while True:
i=i+1
print multiprocessing.current_process(),i

for i in range(0,8):
p = MyThread()
p.start()

I to był mój błąd ;-)
Bo teraz program nie działa tak, że tworzy 8 wątków, które sobie robią co mają robić... o nie ;-)
Teraz program po uruchomieniu odpala jak rozumiem 8 swoich kopii, każda sobie chyba nadal wykonuje to z run, ale tu nie mam pewności ;-) każda z tych 8 kopii uruchamia kolejne 8 kopii, każda z tych kopii kopii (64 już) uruchamia kolejne 8 i tak dalej ;-)
Komputer przestał mi odpowiadać przy blisko 12 tysiącach procesów, które zużywały już ponad 16GB RAM ;-) zabicie tego potwora się nie powiodło ;-)


Podobne postybeta
Python i wiele rdzeni ;-)
Python z urllib = najlepszy menadżer pobierania ;-)
"Skoro ludzie wyewoluowali z małp to czemu małpy nadal istnieją?"
Python for Android vs. AppInventor - 2:0 ;-)
Maszyna stanów kontra labirynt ;-)

2 komentarze:

  1. yyy... fork bomba w phytongu? Swoją drogą nie zastanowiło cię, dlaczego jedno ma w nazwie Thread a drugie Process skoro interfejs ten sam?

    OdpowiedzUsuń
    Odpowiedzi
    1. Wpaść wpadłem, ale skoro stwierdzenie na StackOverflow było w stylu "użyj multiprocessing, w miejsce threading, ma taki sam interfejs więc nie będzie to trudne" to założyłem, że po prostu mamy przykład Pythonowego nazewnictwa (coś jak z urllib i urllib2, albo tym jak rozbito urllib2 w Pythonie 3.0, czyli że nazywamy jak nam się podoba ;-)). No i stwierdziłem, że spróbuję zobaczyć czy to pomoże ;-)

      Usuń