Нужно что-то вроде RR.
Будет ли равномерным распределение заданий в очереди Queue.Queue() по тредам? Смущает то что задания появляться будут медленней чем выполнение команд по ним.
Запускаю несколько тредов (с разным кодом под разные устройства) и тред который принимает задания по http. Задание попадает в очередь, а до этого воркеры висят заблокированном queue.get().
Я использовал в другом проекте multiprocessing.dummy.Pool - там все красиво и равномерно, но сейчас треды имеют разный код внутри и одной функцией не обойдешься.
Задача разгрузить исполнительные устройсва, а не процессор.
Ответ
Сперва почему-то хотелось ответить, что распределение неравномерное - то есть часть потоков будет простаивать, а тот, что был создан первее всех будет отдуваться за всех. Видимо такой поспешный вывод из-за наивного представления потоков в воображении. Но вот эксперимент (py3) - задания появляются в два раза медленнее, чем обрабатываются:
import queue
import threading
import time
import random
counter = {}
lock = threading.Lock()
def worker():
while True:
try:
sleep = q.get()
if sleep == "DIE":
q.task_done()
return
print(threading.current_thread().name)
with lock:
counter[threading.current_thread().name] = counter.get(threading.current_thread().name, 0) + 1
time.sleep(sleep)
q.task_done()
except queue.Empty:
pass
q = queue.Queue()
pool = [threading.Thread(target=worker, name="Worker " + str(i)) for i in range(4)]
[t.start() for t in pool]
for i in range(100):
rand_sleep = random.random() / 8
q.put(rand_sleep)
time.sleep(rand_sleep * 2)
for i in range(4):
q.put("DIE")
q.join()
print("Report: ", counter)
Вот что скрипт выводит:
output: ('Report: ', {'Worker 2': 25, 'Worker 3': 25, 'Worker 0': 25, 'Worker 1': 25})
Как видно из результатов - для моего кода распределение равномерное.
Если задания поступают без задержек - то распределение неравномерное и зависит от того, как долго обрабатывает задание каждый поток.
Дополнение: данный скрипт был протестирован в Windows и Ubuntu, использовался Python3.4 и Python2.7. Во всех четырех случаях результаты одинаковы.
Комментариев нет:
Отправить комментарий