Threads meghatározása Pythonban

Threads meghatározása Pythonban
2019-02-22T17:30:14+01:00
2019-02-24T14:10:05+01:00
2022-10-15T21:35:47+02:00
HelloWorld
Sziasztok! Kaptam egy feladatot, miszerint egy térben meg kell határoznom egy fix ponttól több pont távolságát. Erre létrehoztam egy numpy arrayt (100x100x100 az értékek pedig 0-tól 999 999-ig találhatóak benne). Definiáltam Pytagorasz tételét, amely kiszámolja a távolságot.

A nagyobb probléma az, hogy ennek a kis programnak több szálon kell futnia, hogy összehasonlíthassam az időt, ami alatt lefut a program. Például, ha 2 szálon fut, akkor ennyi az idő, ha 4 szálon, akkor ennyi... Mivel nincs tapasztalatom sem a pythonban sem a Threadingben, ezért kérem segítségeteket. Hogyan lehet megadni, hogy például, most a program 2 szálon fusson, aztán átírni 4-re, stb...

A program így néz ki:

from numpy import arange import numpy as np import os import threading import time #Létrehozott array, amely szimbolizálja a teret Ter = arange(1000000).reshape(100,100,100) # Kezdő pont [0,0,0] koordinátákkal, értéke 0 # Ettől a ponttól számítjuk a távolságot k_pont = 0 #pontok értéke, amelyek távolságát a kezdőponttól ki akarjuk számítáni: listába rendezve pontok = [1, 25398, 123456, 6378, 34560, 876543, 418, 77777, 100000, 999999, 88, 6987, 63254, 74, 3, 100, 5978, 3654, 7895, 6321, 587] #Kiszámolja a kezdő és az adott ponzt közti távolságot def Tavolsag(k_pont,pont_index, i): tav = ((k_pont - pont_index[0])**2 + (k_pont - pont_index[1])**2 + (k_pont - pont_index[2])**2)**0.5 print('A kezdő pont tavolsága a '+ str(i) +'. számtól =' + str(tav)) if __name__ == "__main__": for i in range(len(pontok)): #Megadja a pontok koordinátáit pont_index = np.where(Ter == pontok[i]) #inicializálom a threadet tavolsag = threading.Thread(target = Tavolsag, args=(k_pont,pont_index, i)) tavolsag.start() tavolsag.join()
Mutasd a teljes hozzászólást!
Sajnos a Python kódok még a többinél is rosszabbul viselik, amikor a Prog.hu selejtes üzenetszerkesztője elbarmolja a behúzásokat. Kódbeillesztéshez a következő eljárást javaslom: bebököd, hogy kód lesz (</> ikon), beírsz mondjuk egy "a" betűt, átváltasz a markupszerkesztőre (a legjobboldali ikon), és ott illeszted be a kódot az "a" betű helyére. Persze ez úgy is működik, ha kézzel írod be a code tag-eket (persze szintén a markup szerkesztőben), csak így gyorsabb.

A multiprocessing-es kérdéshez: a legeslegelső kódrészletre van csupán szükséged a dokumentációból (multiprocessing — Process-based parallelism — Python 3.7.2 documentation , ahol a Pool(5) azt jelenti, hogy 5 párhuzamos "processz"-en számítgat majd).
Azaz írd át a Tavolsag függvényedet olyanra, hogy a távolsággal visszatérjen, és semmiképpen se írja azt ki (a kiírás nagyon rossz hatással van a párhuzamosságra), és for ciklus helyett az ott látható map segítségével menj végig a listádon. Utána persze kiírathatod az eredményt, de azt már nem érdemes a futásidő mérésébe belevenni, mert a képernyőre írás az egy lassú művelet, és nincs köze a számításokhoz.
Mutasd a teljes hozzászólást!

  • Egy jó google keresés, és már meg is van a válasz, nem kell ezért témát nyitni.
    Google: "numpy limit number of threads" --> első találatra klikk.
    Limit number of threads in numpy
    Mutasd a teljes hozzászólást!
  • Azt érdemes figyelembe venni, hogy Pythonban nem úgy működnek a threadek, mint más nyelvekben. Egyszerre két thread nem futhat (még ha lehetőség lenne rá, akkor sem) a GIL (global interpreter lock) miatt. Ha ténylegesen többszálas programot akarsz, akkor kénytelen leszel a processekkel kísérletezni.
    Mutasd a teljes hozzászólást!
  • Köszönöm a tanácsot. Átírtam processekre:

    from multiprocessing import Process ... if __name__ == "__main__": processes = [] for i in range(len(pontok)): #Megadja a pontok koordinátáit pont_index = np.where(Ter == pontok) #inicializálom a threadet process = Process(target = Tavolsag, args=(k_pont,pont_index, i)) processes.append(process) process.start() for process in processes: process.join()
    Most hogy határozhatom meg, hogy hány szálon dolgozzon egyszerre, hogy tudjam tesztelni az idő miatt? Láttam, hogy van valami "Pool" is, amely megfelel erre a célra, de nem iagzán sikerül arra átírni a programot. Esetleg kérhetnék benne segítséget?
    Mutasd a teljes hozzászólást!
  • Sajnos a Python kódok még a többinél is rosszabbul viselik, amikor a Prog.hu selejtes üzenetszerkesztője elbarmolja a behúzásokat. Kódbeillesztéshez a következő eljárást javaslom: bebököd, hogy kód lesz (</> ikon), beírsz mondjuk egy "a" betűt, átváltasz a markupszerkesztőre (a legjobboldali ikon), és ott illeszted be a kódot az "a" betű helyére. Persze ez úgy is működik, ha kézzel írod be a code tag-eket (persze szintén a markup szerkesztőben), csak így gyorsabb.

    A multiprocessing-es kérdéshez: a legeslegelső kódrészletre van csupán szükséged a dokumentációból (multiprocessing — Process-based parallelism — Python 3.7.2 documentation , ahol a Pool(5) azt jelenti, hogy 5 párhuzamos "processz"-en számítgat majd).
    Azaz írd át a Tavolsag függvényedet olyanra, hogy a távolsággal visszatérjen, és semmiképpen se írja azt ki (a kiírás nagyon rossz hatással van a párhuzamosságra), és for ciklus helyett az ott látható map segítségével menj végig a listádon. Utána persze kiírathatod az eredményt, de azt már nem érdemes a futásidő mérésébe belevenni, mert a képernyőre írás az egy lassú művelet, és nincs köze a számításokhoz.
    Mutasd a teljes hozzászólást!
  • Köszönöm szépen! Átírtam és minden szépen működik! :) Minél több processzt használok, annál gyorsabb a program. Hálás vagyok! :)
    Mutasd a teljes hozzászólást!
  • Nem lehetne erről a szövegszerkesztő anomáliáról -- esetleg megoldási javaslattal -- tájékoztatni a Rendszer Gézát?

    Azért még se járja, hogy egy 'prog.hu" oldalon ne lehessen pont egy kódot kívánalmak nélkül megjeleníteni.
    Mutasd a teljes hozzászólást!
  • https://prog.hu/tarsalgo/157219/hibak-a-prog-hu-n-topic?no=974#e974  szerint TinyMCE-t használ a lap, és hogy mozi kéne a kifogásokról, de úgy látom, hogy ilyen végül nem született.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd