[python] vlakna,cpu

vepro p.zlamal na gmail.com
Pátek Listopad 19 16:54:01 CET 2010


Tak se mi konecne podarilo aplikaci prepsat z vlaken na procesy pomoci 
modulu multiprocessing, avsak opet se to cele chova nejak podivne. Uloha 
se sice spusti ve vice procesech (tedy na vice jadrech), ale v podstate 
vzdy jen dve bezi na 100% a ostatni na cca 20%. I pri tomto behu bych 
vsak cekal, ze uloha bude vykonana rychleji, nez kdyz ji spustim jako 
jeden proces (tudiz jeden proces=jedno jadro), ale to se nedeje:( 
Dokonce je vyrazne pomalejsi i proti verzi s vlakny bezici na jednom 
jadre. Napada nekoho duvod, proc tomu tak je? Mozna je problem s tim, ze 
v procesech pouzivam sdilene promenne, ale bez toho se proste neobejdu.
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 vepro<p.zlamal na 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 na py.cz
>> http://www.py.cz/mailman/listinfo/python
>>
>>      
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
>    



Další informace o konferenci Python