`Ce code est une tentative d'utiliser une file d'attente pour alimenter tâches à un certain nombre processus de travail .multitraitement et Queues
Je voulais mesurer la différence de vitesse entre différents nombres de processus et différentes méthodes de traitement des données.
Mais la sortie ne fait pas ce que je pensais.
from multiprocessing import Process, Queue
import time
result = []
base = 2
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 23, 45, 76, 4567, 65423, 45, 4, 3, 21]
# create queue for new tasks
new_tasks = Queue(maxsize=0)
# put tasks in queue
print('Putting tasks in Queue')
for i in data:
new_tasks.put(i)
# worker function definition
def f(q, p_num):
print('Starting process: {}'.format(p_num))
while not q.empty():
# mimic some process being done
time.sleep(0.05)
print(q.get(), p_num)
print('Finished', p_num)
print('initiating processes')
processes = []
for i in range(0, 2):
if __name__ == '__main__':
print('Creating process {}'.format(i))
p = Process(target=f, args=(new_tasks, i))
processes.append(p)
#record start time
start = time.time()
# start process
for p in processes:
p.start()
# wait for processes to finish processes
for p in processes:
p.join()
#record end time
end = time.time()
# print time result
print('Time taken: {}'.format(end-start))
Je attends ceci:
Putting tasks in Queue
initiating processes
Creating process 0
Creating process 1
Starting process: 1
Starting process: 0
1 1
2 0
3 1
4 0
5 1
6 0
7 1
8 0
9 1
10 0
11 1
23 0
45 1
76 0
4567 1
65423 0
45 1
4 0
3 1
21 0
Finished 1
Finished 0
Time taken: <some-time>
Mais au lieu que je en fait obtenir ceci:
Putting tasks in Queue
initiating processes
Creating process 0
Creating process 1
Time taken: 0.01000523567199707
Putting tasks in Queue
Putting tasks in Queue
initiating processes
Time taken: 0.0
Starting process: 1
initiating processes
Time taken: 0.0
Starting process: 0
1 1
2 0
3 1
4 0
5 1
6 0
7 1
8 0
9 1
10 0
11 1
23 0
45 1
76 0
4567 1
65423 0
45 1
4 0
3 1
21 0
Finished 0
Il semble y avoir deux problèmes majeurs, je ne suis pas sûr lié ils sont:
Les états d'impression tels que:
Putting tasks in Queue
initiating processes
Time taken: 0.0
sont répétées systématiquement si le code - je dis systématiquement becasue ils répètent exactement à chaque fois.Le second processus ne se termine jamais, il reconnaît jamais la file d'attente est vide et ne permet donc pas quitter
Je sonne comme vous Vous avez des problèmes de formatage de code: Vous ne devriez avoir qu'une seule impression 'Time taken: ...'. – quamrana
Plus vous ne devriez jamais interroger 'q.empty() 'car un thread gourmand peut voler le dernier élément et laisser tous les autres threads en attente d'éléments qui n'apparaîtront jamais. Ce que vous devez utiliser est un marqueur de fin de file d'attente. Un par fil. – quamrana
Sinon, c'est une bonne question. Vous avez montré un certain effort dans l'écriture de code et la collecte des résultats * et * montré ce que vous attendiez. – quamrana