Re: [python] vlakna,cpu

2010-11-19 Tema obsahu Jirka Vejrazka
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

2010-11-19 Tema obsahu vepro

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

2010-11-19 Tema obsahu vepro

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

2010-11-18 Tema obsahu vepro

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

2010-11-18 Tema obsahu Tomas Brabenec

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

2010-11-18 Tema obsahu Jirka Vejrazka
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

2010-11-18 Tema obsahu Hynek Fabian
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

2010-11-18 Tema obsahu Petr Messner
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

2010-11-18 Tema obsahu vepro

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