#python #многопоточность #очередь
Нужно что-то вроде RR. Будет ли равномерным распределение заданий в очереди Queue.Queue() по тредам? Смущает то что задания появляться будут медленней чем выполнение команд по ним. Запускаю несколько тредов (с разным кодом под разные устройства) и тред который принимает задания по http. Задание попадает в очередь, а до этого воркеры висят заблокированном queue.get(). Я использовал в другом проекте multiprocessing.dummy.Pool - там все красиво и равномерно, но сейчас треды имеют разный код внутри и одной функцией не обойдешься. Задача разгрузить исполнительные устройсва, а не процессор.
Ответы
Ответ 1
Сперва почему-то хотелось ответить, что распределение неравномерное - то есть часть потоков будет простаивать, а тот, что был создан первее всех будет отдуваться за всех. Видимо такой поспешный вывод из-за наивного представления потоков в воображении. Но вот эксперимент (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. Во всех четырех случаях результаты одинаковы.
Комментариев нет:
Отправить комментарий