Re: [python] vlakna,cpu
Jeste me napadla jedna vec, nevim jak moc se to da aplikovat na problem ktery resis, ale casto pomuze vystoupit z Pythonu a pomoci si nejakym externim nastrojem, tady me napada treba memcached (atomicke operace na jednoduchych strukturach) nebo celery (cili fronty). Jirka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] vlakna,cpu
Sdilene promenne pouzivam takto: mgr=multiprocessing.Manager() pointA=mgr.list() voxelGrid_list=mgr.list() storage=mgr.dict() global_index=mgr.list([0]) Tyto promenne pak do jednotlivych procesu vlozim pri jejich zakladani jako argument. Jednotlive procesy pak jen do techto promennych pridavaji hodnoty (append) a proto jsem nepuzil zadny zamek. Jediny zamek co pouzivam je v ramci kodu citajici tri instrukce, kde jednotlive procesy inkrementalne zvysuji hodnotu promenne. Dle teto promenne se pak uklada hodnota do pole, tak ze index bude odpovidat teto zvysovane promenne. self.lock.acquire() self.storage[unicode(self.index)]=self.global_index[0] self.pointA.append([self.local_x,self.local_y,self.local_z]) self.global_index[0]=self.global_index[0]+1 self.lock.release() To je snad jedina cast, kdy muze jeden proces ovlivnovat druhy. Petr On 11/19/2010 05:03 PM, Jirka Vejrazka wrote: duvod, proc tomu tak je? Mozna je problem s tim, ze v procesech pouzivam sdilene promenne, ale bez toho se proste neobejdu. To zalezi na tom, jake sdilene promenne pouzivas a jak moc na sebe jednotlive procesy cekaji. Muzes to nejak priblizit, pripadne sem hodit kus kodu? Kdyby byl zajem, muzu dohledat zajimave video z jednoho PyConu (myslim, ze australskeho), kde jeden clovek detailne popisoval co se deje v Pythonu na jednom a vice jadrech, ale asi ti to k reseni problemu moc nepomuze. Jirka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] vlakna,cpu
Dik. Zamyslim se nad tim. Petr On 11/19/2010 06:49 PM, Jirka Vejrazka wrote: No, on multiprocessing pouziva zamky i interne pri pristupu k datovym strukturam, takze jestli se nepletu tak v tomhle pripade nepotrebujes explicitni zamky (ale viz dokumentace, uz je to dlouho co jsem ho pouzival). Opravdu by v tomhle pripade nebyly lepsi fronty? Nevim, jak dlouho trva spocitani dalsiho bodu, ale pokud to neni casove narocna operace, tak bych si dokazal predstavit ze cekani na global_index bude zasadne ovlivnovat jednotlive procesy. Neni tohle spis uloha pro pool of workers? Viz priklad z dokumentace multiprocessingu: http://docs.python.org/library/multiprocessing.html#using-a-pool-of-workers Dalsi tipy: - pouziti memcached pro global_index[0]. Vypada to, ze to je prosty citac a tady by memcached bylo mozna uplne nejlepsi reseni (jednoducha instalace pokud pracujes na Linuxu) - reseni klient-server, kdy jeden ridici proces ma datove struktury a ostatnim zadava ulohy do fronty a hotove vysledky se vraceji v jine fronte. Pak bys nemusel resit synchronizaci pristupu k datovym strukturam. To jsou jen takove tipy, vic asi neporadim. Jirka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
[python] vlakna,cpu
Pratele, Napsal jsem si aplikaci, ktera vyuziva vlakna v pythonu (modul threading). Muzu libovolne volit od jednoho vlakna az po X vlaken. Co se deje je, ze pokud spustim kod pouze na jednom vlakne je uloha dokoncena o dost rychleji, nez pokud ji pustim na vice vlaknech. Tusim, ze nejaky cas zabere rezie ,ale v tomto bych to nehledal. Procedury v jednotlivych vlaknech jsou temer nezavisle (pouze jeden zamek u sdilene promenne). Co je mi divne a myslim, ze v tom je zakopan pes, ze vyuziti procesoru je zhruba stejne (100%) pro ulohu bezici v jednom, tak i ve vice vlaknech. Vypada to tak, ze vice vlaken vyuziva pouze jedno jadro procesoru (onech 100%), tak jako jednovlaknovy proces. Je tedy nutne nejak pythonu rici, ze ma vyuzivat vice jader pro vlakna? Dekuji za pripadnou radu Petr ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] vlakna,cpu
Ano, presne tak, Python standardne vyuziva pouze jedno jadro. Kazdopadne, Python uz, tusim od 2.6, umi v zakladu s vice jadry pracovat: http://docs.python.org/dev/library/multiprocessing.html T. Dne 18.11.2010 16:31, vepro napsal(a): Pratele, Napsal jsem si aplikaci, ktera vyuziva vlakna v pythonu (modul threading). Muzu libovolne volit od jednoho vlakna az po X vlaken. Co se deje je, ze pokud spustim kod pouze na jednom vlakne je uloha dokoncena o dost rychleji, nez pokud ji pustim na vice vlaknech. Tusim, ze nejaky cas zabere rezie ,ale v tomto bych to nehledal. Procedury v jednotlivych vlaknech jsou temer nezavisle (pouze jeden zamek u sdilene promenne). Co je mi divne a myslim, ze v tom je zakopan pes, ze vyuziti procesoru je zhruba stejne (100%) pro ulohu bezici v jednom, tak i ve vice vlaknech. Vypada to tak, ze vice vlaken vyuziva pouze jedno jadro procesoru (onech 100%), tak jako jednovlaknovy proces. Je tedy nutne nejak pythonu rici, ze ma vyuzivat vice jader pro vlakna? Dekuji za pripadnou radu Petr ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] vlakna,cpu
Nijak :( Pythin pouziva GIL, neboli Global Interpreter Lock. Kvuli komplikacim se zamykanim vnitrnich struktur Pythonu je to udelane tak, ze se vlakna stridaji a nebezi paralelne. Je to znamy problem Pythonu, ale nikdo ho zatim nevyresil. Zkus se mrknout na modul processing, ktery misto vlaken pouziva procesy ale jinak je jeho pouziti skoro stejne jako u threadingu, samozrejme pak neni (jednoduchy) pristup ke sdilenym datum. Tusim, ze modul procesisng do jiste miry obchazi GIL, ale ted s nejsem na 100% jisty a nemam pristup k PC, tak si to radsi dohledej. Jirka On 18/11/2010, vepro p.zla...@gmail.com wrote: Pratele, Napsal jsem si aplikaci, ktera vyuziva vlakna v pythonu (modul threading). Muzu libovolne volit od jednoho vlakna az po X vlaken. Co se deje je, ze pokud spustim kod pouze na jednom vlakne je uloha dokoncena o dost rychleji, nez pokud ji pustim na vice vlaknech. Tusim, ze nejaky cas zabere rezie ,ale v tomto bych to nehledal. Procedury v jednotlivych vlaknech jsou temer nezavisle (pouze jeden zamek u sdilene promenne). Co je mi divne a myslim, ze v tom je zakopan pes, ze vyuziti procesoru je zhruba stejne (100%) pro ulohu bezici v jednom, tak i ve vice vlaknech. Vypada to tak, ze vice vlaken vyuziva pouze jedno jadro procesoru (onech 100%), tak jako jednovlaknovy proces. Je tedy nutne nejak pythonu rici, ze ma vyuzivat vice jader pro vlakna? Dekuji za pripadnou radu Petr ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] vlakna,cpu
Interpret pythonu upouziva jeden globalni zamek pro pristup ke vsem promennym. AFAIK vlakna ma v pythonu smysl pouzivat jedine pro kod z externich knihoven nebo pri (ne)cekani na blokujici operace. Na vytizeni vice jader samotnym pythonem je potreba odforkovat cele instance interpretru. vepro (Thursday 18 November 2010 16:31:03): Pratele, Napsal jsem si aplikaci, ktera vyuziva vlakna v pythonu (modul threading). Muzu libovolne volit od jednoho vlakna az po X vlaken. Co se deje je, ze pokud spustim kod pouze na jednom vlakne je uloha dokoncena o dost rychleji, nez pokud ji pustim na vice vlaknech. Tusim, ze nejaky cas zabere rezie ,ale v tomto bych to nehledal. Procedury v jednotlivych vlaknech jsou temer nezavisle (pouze jeden zamek u sdilene promenne). Co je mi divne a myslim, ze v tom je zakopan pes, ze vyuziti procesoru je zhruba stejne (100%) pro ulohu bezici v jednom, tak i ve vice vlaknech. Vypada to tak, ze vice vlaken vyuziva pouze jedno jadro procesoru (onech 100%), tak jako jednovlaknovy proces. Je tedy nutne nejak pythonu rici, ze ma vyuzivat vice jader pro vlakna? Dekuji za pripadnou radu Petr ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] vlakna,cpu
Ahoj, může za to věc zvaná Global Interpreter Lock (GIL). V dynamickém jazyce jako je Python je totiž trochu problém korektně pracovat ve více vláknech, proto to autoři Pythonu vyřešili tímto zámkem (mutexem) - v jednom okamžiku běží Pythonový kód pouze v jednom vlákně. Přesto program může být vícevláknový a má to smysl třeba při práci se sítí, databázemi - GIL je v patřičných okamžicích uvolňován a je požadován až při předávání dat zpět do Pythonu. Lze to obejít spuštěním programu ve více procesech. Pokud je potřeba, aby procesy mezi sebou komunikovaly, lze to řešit, i když to není tak jednoduché jako řešit to mezi vlákny. Viz modul multiprocessing, zmiňovaný ostatními. Třeba u webového nebo aplikačního serveru nemusí být důležité, aby mezi sebou jednotlivé procesy vůbec komunikovaly, pak je řešení triviální (spustit více procesů). Petr Messner 2010/11/18 vepro p.zla...@gmail.com: Pratele, Napsal jsem si aplikaci, ktera vyuziva vlakna v pythonu (modul threading). Muzu libovolne volit od jednoho vlakna az po X vlaken. Co se deje je, ze pokud spustim kod pouze na jednom vlakne je uloha dokoncena o dost rychleji, nez pokud ji pustim na vice vlaknech. Tusim, ze nejaky cas zabere rezie ,ale v tomto bych to nehledal. Procedury v jednotlivych vlaknech jsou temer nezavisle (pouze jeden zamek u sdilene promenne). Co je mi divne a myslim, ze v tom je zakopan pes, ze vyuziti procesoru je zhruba stejne (100%) pro ulohu bezici v jednom, tak i ve vice vlaknech. Vypada to tak, ze vice vlaken vyuziva pouze jedno jadro procesoru (onech 100%), tak jako jednovlaknovy proces. Je tedy nutne nejak pythonu rici, ze ma vyuzivat vice jader pro vlakna? Dekuji za pripadnou radu Petr ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] vlakna,cpu
Dekuji vsem za radu. Zkusim se kouknout na ten processing. Petr On 11/18/2010 05:06 PM, Petr Messner wrote: Ahoj, může za to věc zvaná Global Interpreter Lock (GIL). V dynamickém jazyce jako je Python je totiž trochu problém korektně pracovat ve více vláknech, proto to autoři Pythonu vyřešili tímto zámkem (mutexem) - v jednom okamžiku běží Pythonový kód pouze v jednom vlákně. Přesto program může být vícevláknový a má to smysl třeba při práci se sítí, databázemi - GIL je v patřičných okamžicích uvolňován a je požadován až při předávání dat zpět do Pythonu. Lze to obejít spuštěním programu ve více procesech. Pokud je potřeba, aby procesy mezi sebou komunikovaly, lze to řešit, i když to není tak jednoduché jako řešit to mezi vlákny. Viz modul multiprocessing, zmiňovaný ostatními. Třeba u webového nebo aplikačního serveru nemusí být důležité, aby mezi sebou jednotlivé procesy vůbec komunikovaly, pak je řešení triviální (spustit více procesů). Petr Messner 2010/11/18 veprop.zla...@gmail.com: Pratele, Napsal jsem si aplikaci, ktera vyuziva vlakna v pythonu (modul threading). Muzu libovolne volit od jednoho vlakna az po X vlaken. Co se deje je, ze pokud spustim kod pouze na jednom vlakne je uloha dokoncena o dost rychleji, nez pokud ji pustim na vice vlaknech. Tusim, ze nejaky cas zabere rezie ,ale v tomto bych to nehledal. Procedury v jednotlivych vlaknech jsou temer nezavisle (pouze jeden zamek u sdilene promenne). Co je mi divne a myslim, ze v tom je zakopan pes, ze vyuziti procesoru je zhruba stejne (100%) pro ulohu bezici v jednom, tak i ve vice vlaknech. Vypada to tak, ze vice vlaken vyuziva pouze jedno jadro procesoru (onech 100%), tak jako jednovlaknovy proces. Je tedy nutne nejak pythonu rici, ze ma vyuzivat vice jader pro vlakna? Dekuji za pripadnou radu Petr ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python