Sziasztok!
Írtam egy egyszerű evolúciós algoritmust, ami kb. így néz ki:
Populáció objektum egy lista típusú attribútumában sok Individual objektum van.
Populáció objektumnak van egy run() metódusa, ami levezényli a futást.
Szeretném a kódomat párhuzamosítani, hogy pl. minden processzormagon futtatni tudjak egy-egy populációt. Eddig még nem párhuzamosítottam, így valószínűleg infohiányos is vagyok.
A multiprocessing modullal próbálkoztam, írtam egy wrapper metódust, ami létrehozza a populáció objektumot és lefuttatja azt.
Létrehoztam a process-eket, minden process a wrappert hívja.
A kérdésem az, hogy egy ilyen populáció objektumot milyen shared memory object-tel tudnék kinyerni a subprocessekből miután lejárt a futás?
Köszi!
- 2244 megtekintés
Hozzászólások
OFF: az érzés, mikor egy fórumbejegyzésből egy mondatot sem tudsz értelmezni...:)
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Miert nem threading a multiprocessing helyett? Akkor egy programon belul maradnal es akkor nem lenne problema az objektumok passzolgatasa a szalak kozott.
- A hozzászóláshoz be kell jelentkezni
Mert tudja ezt:
"CPython implementation detail: In CPython, due to the Global Interpreter Lock, only one thread can execute Python code at once (even though certain performance-oriented libraries might overcome this limitation). If you want your application to make better use of the computational resources of multi-core machines, you are advised to use multiprocessing or concurrent.futures.ProcessPoolExecutor. However, threading is still an appropriate model if you want to run multiple I/O-bound tasks simultaneously."
- A hozzászóláshoz be kell jelentkezni
Haha. Mokas. Vagy inkabb siralmas.
- A hozzászóláshoz be kell jelentkezni
Nem siralmas, könnyebb karban tartani a pythont a fejlesztőkenek :D
- A hozzászóláshoz be kell jelentkezni
Ugyan pár hete végighallgattam egy előadást egy fejlesztőtől, aki vagy húsz éve pythonban fejleszt - vagy mittudom én, mióta, nem ez a lényeg - és ez az ember azt állította, hogy egy python program mindenképp csak egy core-on fog futni, akkor is, ha használsz threadinget. Amúgy arról szólt az előadás, hogy miként lehet a threadinget megkerülve gyors programot alkotni, de nekem sok volt, messze vagyok még ettől...
Ave, Saabi.
- A hozzászóláshoz be kell jelentkezni
Hát rosszul tudta az ember, valódi oprendszer szál képződik, a magokra szétdobálást meg a kernel elvégzi, ha kell.
- A hozzászóláshoz be kell jelentkezni
Sajnos igen is meg nem is. Képződik szál, de maga a Python interpreter egy adott szálon fut, a GIL miatt egy időpillanatban egyszerre csak egy Python utasítás hajtódik végre.
Esetleg próbáld meg a Go-t (golang.org), sokkal egyszerűbb a párhuzamosítás.
GT
- A hozzászóláshoz be kell jelentkezni
Van olyan python kódom, amit nem párhuzamosítottam, de mégis sokszor mindegyik mag 100%-on fut (numpy + numba kombót használva). Nem kéne, de mégis.
Egyébként az ipython parallellt is érdemes lehet megnézni.
----
"Mert nincs különbség: mindenki vétkezett, és híjával van az Isten dicsőségének. Ezért Isten ingyen igazítja meg őket kegyelméből, miután megváltotta őket a Krisztus Jézus által." (Róma 3.22-24)
- A hozzászóláshoz be kell jelentkezni
Szerintem ez azért van, mert a numpy eleve párhuzamosított. Ebben nem vagyok biztos, az tuti, hogy nagy részét C-ben írták.
- A hozzászóláshoz be kell jelentkezni
Szia!
Én ilyenből írtam a szakdolgozatomat. A deap-ról hallottál? Én azt használtam keretnek és jól működött. Egy kis profilozással, pandas és numpy kombóval használható lett a dolog. Milyen problémát akarsz megoldani az algoritmussal?
Itt mmeg tudod nézni, írtam a módszerről, de az algoritmus nincs fent githubon még. http://szd.lib.uni-corvinus.hu/8220/
- A hozzászóláshoz be kell jelentkezni
Mellékes kérdés: mi a cél?
- összes CPU mag kiterhelése,
- vagy egy ténylegesen gyorsan futó szoftver?
Utóbbi esetben
1. lépés: python helyett pypy környezet használata. Nyelv marad python.
2. lépés: megismerkedni a SWIG-gel és C/C++-ban aláfejleszteni az időigényes részfolyamatok függvényeit. Elég csak az időigényes részeket.
Tapasztalatom szerint:
- python --> pypy átlagosan 5-szörös tempó
- swig ---> további 3..4-szeres nyereség a pypy-hez képest.
És ha ennél is nagyobb tempó kell, ekkor jöhet a többmagos tempónövelés, mivel a C-ben írt függvény a függvényen belül ténylegesen párhuzamosítható. Lásd: https://linuxprograms.wordpress.com/2007/12/29/threads-programming-in-l…
- A hozzászóláshoz be kell jelentkezni
Köszönöm szépen a válaszokat!
Közben sikerült sima multiprocessing.Queue-val megoldani. Minden hozzám hasonló pythonos párhuzamosítónak üzenem: a queue-ba akármit bepakoló process deadlockolja a scriptet ha az általa berakott objektum queue-ból való kivétele előtt join-oljuk az adott processt..
Utána fogok nézni minden linkelt forrásnak! Köszi!
- A hozzászóláshoz be kell jelentkezni