Заставьте ThreadPoolExecutor принимать следующий URL-адрес, когда поток доступен

#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))