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.
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()
Töltsd fel egy erre való oldalra és linkeld!
Most telóról nem tudok mondani, de Google: share Python code
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.
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).
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
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.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!