Я хотел бы представить что-то вроде ниже.Это делается с помощью идентификатора строки в базе данных.Не очень хорошее решение, если у вас огромные пробелы в идентификаторе.Вы можете реорганизовать это для использования некоторого столбца даты или любых других данных, которые могут помочь в пакетных записях.
10
- количество потоков
i
- номер текущего потока, который мы повторяемчерез
10000
- размер пакета, используемый для получения пакета из 10000 электронных писем
counter
- переменная, определяющая, какой поток должен отвечать за какой идентификатор пакета
maximumEmailId
- максимальный идентификатор электронной почты в таблице электронных писем
1. Create 10 numbered threads - 0, 1, 2..., 9
2. Start every thread
3. For each thread number (i):
4. For counter = 0, step 10000
5. if (counter / 10000) % 10 == i then
- SELECT * FROM emails WHERE id BETWEEN (counter) AND (counter + 10000)
- Send emails
6. if counter > maximumEmailId then break;
Он будет вести себя так:
iteration 0:
-thread 0 - counter = 0 - select ... where id between 0 and 10000
-thread 1 - counter = 10000 - select ... where id between 10000 and 20000
-thread 9 - counter = 90000 - select ... where id between 90000 and 100000
iteration 1:
-thread 0 - counter = 100000 - select ... where id between 100000 and 11000
-thread 1 - counter = 110000 - select ... where id between 110000 and 12000
-thread 9 - counter = 190000 - select ... where id between 190000 and 20000
По сути, это решение не имеет ничего общего с блокировкой, техническими параллельными приемами и т. Д., Вы просто делите свой набор данных, чтобы никто не пытался прочитать один и тот же пакет.Представьте себе 100 коробок на земле, нить 0
принимает коробки с номерами 0, 10, 20,...,90
, нить 1
коробки 1, 11, 21,...,91
и т. Д.