Kezdőoldal » Számítástechnika » Programozás » Valamit nagyon elrontottam...

Valamit nagyon elrontottam (Python)? Tanulom a párhuzamos feladat végrehajtást. A program megakad a p.join() sornál. Azt egyszer végrehajtja és vár.

Figyelt kérdés

from multiprocessing import Lock, Process, Queue, current_process

import time

import queue # imported for using queue.Empty exception

import math

import os

from datetime import datetime


def do_job(tasks_to_accomplish, tasks_that_are_done,primes,blocksize):

while True:

try:


''' try to get task from the queue. get_nowait() function will

raise queue.Empty exception if the queue is empty.

queue(False) function would do the same task also.

'''

task = tasks_to_accomplish.get_nowait()

except queue.Empty:


break

else:

'''

if no exception has been raised, add the task completion

message to task_that_are_done queue

'''

def rosta(bs,kor):

eredm=[]

def IsPrime(n):

prime=True

if n>17 :

maximum=int(math.sqrt(n))+1

else:

maximum=n


for i in primes:

if n>maximum : break

if n%i==0:

prime=False

break

return prime


for pr in range((kor-1)*bs+1,kor*bs,2):

if IsPrime(pr):eredm.append(pr)

return eredm


tmp=rosta(blocksize,task)

tasks_that_are_done.put(tmp)

time.sleep(.5)

return True



def main():

primes=[2,3,5,7,11,13,17]

blocksize=1

for i in primes:blocksize=blocksize*i

number_of_task = 5

number_of_processes = 5

tasks_to_accomplish = Queue()

tasks_that_are_done = Queue()

processes = []

def IsPrime(n):

prime=True

if n>17 :

maximum=int(math.sqrt(n))+1

else:

maximum=n

for i in primes:

if i>maximum :break

if n%i==0:

prime=False

break

return prime

for pr in range(21,blocksize+1,2):

if IsPrime(pr):primes.append(pr)

#print(primes)



for i in range(1,number_of_task+1):

tasks_to_accomplish.put(i)


# creating processes

for w in range(number_of_processes):

p = Process(target=do_job, args=(tasks_to_accomplish, tasks_that_are_done,primes,blocksize))

processes.append(p)

p.start()


# completing process

for p in processes:

print("qwe")

p.join()

print('asd')

# print the output

while not tasks_that_are_done.empty():

print(tasks_that_are_done.get()[0])


return True



if __name__ == '__main__':

main()



2021. szept. 23. 11:50
1 2
 1/13 A kérdező kommentje:
Húdejó kiszedte az identet. Hogyan tudom azzal együtt kiírni?
2021. szept. 23. 11:51
 2/13 Pelenkásfiú ***** válasza:

Töltsd fel egy erre való oldalra és linkeld!

Most telóról nem tudok mondani, de Google: share Python code

2021. szept. 23. 11:58
Hasznos számodra ez a válasz?
 3/13 A kérdező kommentje:

Github lett a nyerő

[link]

2021. szept. 23. 12:24
 4/13 anonim ***** válasza:

nem tudom, utána néztél-e már, mit jelent a join itt:


"the method blocks until the process whose join() method is called terminates."

[link]


"it just means "wait for this [thread/process] to complete"."

[link]


a processed dolgozik sokáig és te vársz, hogy befejeződjön

2021. szept. 23. 13:18
Hasznos számodra ez a válasz?
 5/13 anonim ***** válasza:

Nem kimondottan a join-on múlik, ha azt kiszedem akkor se fut le.

Deadlock (holtpont) alakul ki elég durván többszörösen is rá van erre segítve. A kód alapján azt feltételezem, hogy az alapok sincsennek meg. Többször implementált IsPrime függvény például.

Itt csupán csak demonstráció céljából (lehet mondani ezért nem elegáns megoldás vagy azért nem de itt nem azon van a lényeg, hogy ez élesbe ez a kód legyen) 4 gyerekprocesszt hozok létre és meg lehet nézni mit csinál : [link]

Az l globális változónak másolatait kapják meg a gyerekprocesszek. A lefutási sorrend nem garantált hogy indítási sorrendben fognak lefutni a gyerekprocesszek. Egy gyerek process-es végrehajtásra szánt Queue-be pakolgatnak be stringeket a példába. Ököl szabály párhuzamosításnál hogy van egy vagy több író process amely egy objektumot ír mely objektumnak egy olvasó processe van. Az úgy csak a bonyodalmakat okozza ha több is olvassa jelen esetben itt írás és olvasás a put meg a get. Mindegyik process objektumra a join() metódus az sorompónak nevezett dolgot csinál, azaz a főprocessz bevárja az összes gyerek processzt vagy ha úgy tetszik az összes worker-t.

Nem tudom ki mit tud, de nekem nagyságrendekkel (azaz legalább ezerszer egyszerűbb) jól implementálni mint azt bogarászni a kérdező általi kód mikor hogy kerül holtpontba meg miért nem jól működik.

Bár nem írta le a kérdező mit szeretne, de úgy látom hogy párhuzamosítással gyerekprocesszekkel a prímszámokat akarja kiszámolni.

2021. szept. 23. 14:38
Hasznos számodra ez a válasz?
 6/13 anonim ***** válasza:
Egyszerűbb példákkal kezdd a tanulást. Ez a kód túl komplex ahhoz rászánjam az időt.
2021. szept. 23. 16:19
Hasznos számodra ez a válasz?
 7/13 A kérdező kommentje:

Egyszerű ujjgyakorlatnak szántam. Volt egy mintaprogram, ami csak a processz nevét adta vissza. Azt próbáltam kidekorálni. Önmagában sok értelme nincsen.

A prímszám rosta (szerintem a határok rosszul is vannak ,megadva) (majdnem) csak időhúzásra szolgál (egyszerű sleepet váltottam ki vele).

2021. szept. 23. 16:20
 8/13 A kérdező kommentje:
Köszönöm. Szerintem nagyobb fába vágtam a fejszémet, mint amivel meg tudok birkózni "10 oldalt visszalapozok a könyvben"
2021. szept. 23. 16:21
 9/13 A kérdező kommentje:

Meg van a hiba.

Nem lehet tetszőlegesen nagy listát visszaadni a subprocessből. Ha pár elemet adok csak vissza, akkor lefut.

Kimaradt: Köszönöm a válaszokat

2021. szept. 24. 11:58
 10/13 A kérdező kommentje:

Ma újraolvastam a progit. Bocs szégyenlem, hogy ilyet megmutattam. Annyi "apró hiba" (kétszer definiált IsPrime és társai) került bele a hibakeresés során (meg nem is programozó vagyok).

Na nulláról újra. Most már az is szempont, hogy reális eredmény adjon.

2021. szept. 24. 12:05
1 2

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!