with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    future_to_key = {}
for key, value in list(sources.items()):
    future_to_idday[executor.submit(do_stuff, value)] = key
for future in concurrent.futures.as_completed(future_to_key):
    key = future_to_key[future]
result = future.result()
Подбор предметов постепенно, как только появится очередь