Мой многопоточный процесс не работает правильно - PullRequest
0 голосов
/ 17 декабря 2018

Я хотел бы выполнить пакетную обработку для моего большого набора данных.Я хочу запустить n thread параллельно для обработки каждой партии n выборок данных.Вот симуляция с простой функцией:

from threading import Thread
import queue
def funct(i, a, b, out_que):
    res = {}
    res[i] = a+b
    out_que.put(res)

# I try to run 3 threads in parallel, 5 times
res_list = []
for i in range(5):
    threads = []
    res_queue = queue.Queue()
    for j in range(3):
         thread = Thread(target=funct, args=(j, 5, 6, res_queue))
         thread.start()
         threads.append(thread)
    for thread in threads:
        thread.join()
    resulted = res_queue.get()
    res_list.append(resulted)
print(res_list)

Я хочу получить следующий результат:

[{0: 11}, {1: 11}, {2: 11}, {3: 11}, {4: 11}, {5: 11}, {6: 11}, {7: 11}, {8: 11}, {9: 11}, {10: 11}, {11: 11}, {12: 11}, {13: 11}, {14: 11}]

Но я получил это:

[{0: 11}, {0: 11}, {0: 11}, {0: 11}, {0: 11}]

1 Ответ

0 голосов
/ 17 декабря 2018

Вы получаете только один элемент из вашей очереди res_queue.get().Измените эту часть

resulted = res_queue.get()
res_list.append(resulted)

на что-то подобное

resulted = []
while not res_queue.empty():
    res_list.append(res_queue.get())

Чтобы получить такой результат [{0: 11}, {1: 11}, {2: 11}, {3: 11}, {4: 11}, {5: 11}, {6: 11}, {7: 11}, {8: 11}, {9: 11}, {10: 11}, {11: 11}, {12: 11}, {13: 11}, {14: 11}], вам нужно передать 5*i + j вместо j в args=(j, 5, 6, res_queue).

...