Обработка списка в несколько потоков

У меня есть список который необходимо обработать в n тредов. Я написал вот такой скрипт, но это не корректно т.к. тут количество тредов будет равно количеству записей в списке. А вот как сделать n тредов не могу сообразить

import codecs
import os
import threading


def pr(str):
    print(str + threading.currentThread().getName())


def soap(id_number):
    for number in id_number:
        t = threading.Thread(target=pr, args=(number,))
        t.start()


if __name__ == '__main__':
    id_file = codecs.open(os.path.join(os.path.dirname(os.path.realpath(__file__)), "card.txt"), "r", encoding='utf-8')
    lines = id_file.readlines()
    id_file.close()
    soap(lines)
    exit(0)

Ответы (1 шт):

Автор решения: Roman Konoval

Разбейте список на куски и передавайте в поток кусок:

import threading

def pr(batch):
    for el in batch:
        print('{}: {}'.format(threading.currentThread().getName(), el))

def soap(id_number, n):
    batch_size = (len(id_number) + n - 1) / n
    for i in range(0, len(id_number), batch_size):
        batch = id_number[i:i+batch_size]
        t = threading.Thread(target=pr, args=(batch,))
        t.start()

soap([0,1,2,3,4,5,6,7,8,9], 3)
→ Ссылка