Python evolúciós algoritmus párhuzamosítása

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!

Hozzászólások

OFF: az érzés, mikor egy fórumbejegyzésből egy mondatot sem tudsz értelmezni...:)

Miert nem threading a multiprocessing helyett? Akkor egy programon belul maradnal es akkor nem lenne problema az objektumok passzolgatasa a szalak kozott.

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."

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.

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)

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/

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…

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!