J'essaye de faire un programme multiprocess avec Python. Je Importez le module multiprocessus et j'essaie de commencer à traiter comme ceci:Processus ne pas engendrer python
p = Process(target=self.Parse)
p.start()
p.join()
Dans la classe I ont un compteur de filetage intérieur et j'incrémenter le compteur à chaque fois que le est un processus donné naissance. Mais lorsque j'imprime le nombre de threads, le nombre ne s'incrémente pas. Alors j'appelle multiprocessing.active_children() mais cela retourne une liste vide. Le programme ne génère-t-il pas vraiment les threads ou les processus ou le signale-t-il simplement? le code est le suivant:
def run(self):
if self.cont:
while self.nxtLink or (self.thread>1):
print(active_children())
if self.thread<=self.count:
p = Process(target=self.Parse)
p.start()
p.join()
else:
self.crawl(nxtLink.popleft())
La fonction Parse:
def Parse(self):
self.thread+=1
self.lock.acquire()
next = self.nxtLink.popleft()
self.lock.release()
results = parser(next[0],next[1])
#print("In Parse")
self.broken[next[0]] = results.broken
for i in results.foundLinks:
if(self.thread<=self.count+5):
p = Process(target = self.request, args = (i,next[0]))
p.start()
p.join()
else:
while (self.thread>self.count+5):
pass #Waits for the thread count to drop before spawning a new thread.
p = Process(target = self.request, args = (i,next[0]))
p.start()
p.join()
self.lock.acquire()
self.thread-=1
self.lock.release()
Enfin, la fonction de la demande:
def request(self, requestURL, requestingPageURL):
# print(requestURL)
self.lock.acquire()
self.thread+=1
self.lock.release()
try:
before = list(self.prev)
self.lock.acquire()
self.prev.append(requestURL)
self.lock.release()
if(requestURL in before):
#print(before)
return
nextRequest = req.urlopen(requestURL)
self.lock.acquire()
self.nxtLink.append((requestURL,nextRequest))
self.lock.release()
except err.URLError:
self.lock.acquire()
try:
self.broken[requestingPageURL].append(requestURL)
except KeyError:
self.broken[requestingPageURL] = [requestURL]
self.lock.release()
finally:
self.lock.acquire()
self.thread-=1
self.lock.release()
Je suis vraiment coincé pourquoi ses processus ne se reproduisent Mais le programme Tout fonctionne bien alors je suis un peu confus. Join() attend la fin du processus.
hmmm Je ne me suis pas rendu compte que join() l'a fait. Une question de plus, comment mettriez-vous le processus dans une liste, puis rejoignez-les? – rady
@ user2985233, il existe plusieurs façons de le faire en fonction de ce que fait votre code. Consultez les docs pour multiprocessing.Pool et aussi des exemples d'utilisation multiprocessing.Queue pour les conseils. Vous pouvez passer une file d'attente au processus et lui faire envoyer un message «terminé» lorsque vous avez terminé. Ensuite, la lecture de la file d'attente vous indique quel processus doit être rejoint ensuite. – tdelaney
Donc, je devrais avoir tous les threads dans une liste et continuellement interroger la liste pour voir ce que le processus est fait? et ensuite le rejoindre? – rady