Страницы

Поиск по вопросам

четверг, 2 мая 2019 г.

Будет ли равномерным распределение заданий в очереди?

Нужно что-то вроде 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. Во всех четырех случаях результаты одинаковы.

Комментариев нет:

Отправить комментарий