with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    future_to_key = {}
for key, value in list(sources.items()):
    pass
Picking up items progressivly as soon as a queue is available