#multithreading
Вопрос:
(Чтобы упростить ситуацию, я свел проблему к чему-то простому).
Допустим, я конечная точка билета, где я могу получать результаты, например www.example.com/api/id=2,12,20
, возвращает билеты с идентификатором 2,12
, 20
и API позволяет нам получать 3 идентификатора за вызов, и у меня есть ограничение в 4 потока (только для иллюстрации)
Затем у меня есть 30 идентификаторов, которые я хочу получить, поэтому я хочу использовать многопоточность (я знаю об asyncio
этом , но я хочу сделать это с помощью многопоточности для целей обучения), где первый поток получает id=1,2,3
, второй поток получает id=4,5,6
.., четвертый поток получает id=10,11,12
. Когда любой из потоков завершен, они затем получают следующую последовательность идентификаторов.
У меня есть генератор get_ids()
, который возвращает идентификаторы, которые нужно получить, например
def get_ids(ids,step_size): """ returns bulks of "step_size" from the list "ids """ for i in range(len(ids)//step_size): yield ids[i*step_size:(i 1)*step_size]
и функция с возвращаемыми результатами:
def get_res(ids): print("Hello world!") url = r'www.example.com/api/id=' ",".join(ids) r = requests.get(url) return r.json()
и я пытаюсь сделать это с помощью с ThreadPoolExecutor
with ThreadPoolExecutor(max_workers = 4) as executor: RESULTS = [] for ids in get_ids(list_of_ids,step_size=3): RESULTS.append(executor.submit(get_res(ids)))
Я просто не получаю никакого ускорения. Похоже, что потоки не порождаются; первые 4 "hello world"
отпечатка появляются не сразу, а после некоторой задержки последовательно и в том же темпе, что и 5-й и 6-й и т. Д.
Я думал, что ThreadPoolExecutor
контекст-менеджер max_workers
автоматически создавал потоки, но нужно ли мне вручную составлять RESULTS.append(...)
max_workers
время, но в этом случае, что, если у меня, скажем, 50 потоков?
EDIT:
Я заставил это работать, используя map
i.e
gids = get_ids(list_of_ids,step_size=3) with ThreadPoolExecutor(max_workers = 4) as executor: RESULTS = [] gids = get_ids(list_of_ids,step_size=3) RESULTS.append(executor.map(get_res,gids))