1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| from random import randint
from multiprocessing import Process, Queue, current_process, freeze_support
from time import clock
from sys import argv
def worker(input, output):
for args in iter(input.get, 'STOP'):
result = quicksort(args)
output.put(result)
def quicksort(q):
pos = q[0]
q = q[1]
for x in xrange(100000):
pass
lesser=[]
greater=[]
if len(q) <= 1:
return q
for i in q[1:]:
if i < q[0]:
lesser.append(i)
else:
greater.append(i)
return [pos, [lesser, q[0:1], greater]]
def test(NUMBER_OF_PROCESSES):
#NUMBER_OF_PROCESSES = 4
#NUMBER_OF_PROCESSES = 1
task_queue = Queue()
done_queue = Queue()
for i in range(NUMBER_OF_PROCESSES):
Process(target=worker, args=(task_queue, done_queue)).start()
q = []
for x in xrange(10000):
q.append (randint(0, 100000))
print "Nombre de nombre : ", len(q)
# q = [500, 250, 251, 551, 552]
q_ori = q[:]
q = [q]
# print q
end = False
while not end:
res = {}
tasks = []
pos = 1
nbr_task = 0
for v in q:
if len(v) > 1:
res[pos] = []
task_queue.put([pos, v])
nbr_task += 1
else:
res[pos] = [v]
pos += 1
end = True
print nbr_task
for i in range(nbr_task):
end = False
quick_sort_res = done_queue.get()
item_index = quick_sort_res[0]
res[item_index] = [value for value in quick_sort_res[1] if value]
# print res
q = []
for value in res.itervalues():
for value1 in value:
q += [value1]
# print q
#res += [value for value in quick_sort_res if value]
#print res
for i in range(NUMBER_OF_PROCESSES):
task_queue.put('STOP')
q = [value[0] for value in q]
q_sorted = sorted(q_ori)
print q_sorted == q
# print [value[0] for value in q]
if __name__ == '__main__':
if len(argv) < 2:
print "Passer en argument le nombre de process."
else:
NUMBER_OF_PROCESSES = int(argv[1])
freeze_support()
t0 = clock()
test(NUMBER_OF_PROCESSES)
print clock() - t0 |
Partager