Грамотный диапазон для многопотока

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
639
Благодарностей
581
Баллы
93
Возможно ли такое реализовать ?

Есть файл, в котором лежат email-адреса, берутся диапазоном,без удаления
К примеру, в этом файле лежит 100к строк email-адресов
Во входных настройках я выставлю:
Сколько взять строк: 2000
Задаю кол-во потоков во входных настройках (вывел для дальнейшего удобства) , к примеру 5
Делим "Сколько взять строк" на "кол-во потоков" = 2000/5=400
Т.е. каждый поток должен взять по 400 email-адресов (400 строк на поток)
Важно:
1ый поток берет из файла Email-адреса в диапазоне: от 0 до 400 строк
2ой поток берет из файла Email-адреса в диапазоне: от 400 до 800 строк
3ой поток берет из файла Email-адреса в диапазоне: от 800 до 1200 строк
4ый поток берет из файла Email-адреса в диапазоне: от 1200 до 1600 строк
5ый поток берет из файла Email-адреса в диапазоне: от 1600 до 2000 строк

Если будет задано 10 потоков, то логика та же самая:
Делим "Сколько взять строк" на "кол-во потоков" = 2000/10=200
1ый поток берет из файла Email-адреса в диапазоне: от 0 до 200 строк
2ой поток берет из файла Email-адреса в диапазоне: от 200 до 400 строк
.........
10ый поток берет из файла Email-адреса в диапазоне: от 1800 до 2000 строк
 
Последнее редактирование:

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
1. бери с удалением и неи мозги
2. делай конфиг файл где будет указано какой номер в данный момент используется и лочить потоки при обращении к конфигу
3. использовать глобальные переменные (я до сих пор хз как они работают :-) )

всегда делаю по первому варику, беру с удалением, когда заканчиваются мыльники, идет проверка на пустой файл, если пустой, то мыльники обновляются из бекапа
 

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
639
Благодарностей
581
Баллы
93

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
639
Благодарностей
581
Баллы
93
1. бери с удалением и неи мозги
2. делай конфиг файл где будет указано какой номер в данный момент используется и лочить потоки при обращении к конфигу
3. использовать глобальные переменные (я до сих пор хз как они работают :-) )

всегда делаю по первому варику, беру с удалением, когда заканчиваются мыльники, идет проверка на пустой файл, если пустой, то мыльники обновляются из бекапа
Вариант с удалением строк не подходит
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
639
Благодарностей
581
Баллы
93

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
да хоть миллион шаблонов
при удалении КАЖДЫЙ шаблон будет брать свою пачку строк. ЕСЛИ не нужно чтоб у каждого шаблона были именно свои строки в этой базе, тогда не подойдет.
а если брать просто новые строки для отправки, то еще как подойдет
ну в общем ладно, не подходит значит не подхоит
 

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
639
Благодарностей
581
Баллы
93
Попробовал сделать такой вот костыль, но проблему многопотока он все равно не решит:


1) кубик Java умножает переменную "писем на поток", о которой я писал в стартпосте на счетчик потока
2) берем диапазон из получившегося результата умножения
3) глобальная переменная, то же не понял как с ней работать
 

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
639
Благодарностей
581
Баллы
93
да хоть миллион шаблонов
при удалении КАЖДЫЙ шаблон будет брать свою пачку строк. ЕСЛИ не нужно чтоб у каждого шаблона были именно свои строки в этой базе, тогда не подойдет.
а если брать просто новые строки для отправки, то еще как подойдет
ну в общем ладно, не подходит значит не подхоит
нужно чтоб у каждого шаблона были именно свои строки (диапазон)
 
Последнее редактирование:

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
нужно чтоб у каждого шаблона были именно свои строки (диапазон)
диапазон и свои строки - это разные вещи
диапазон - это ОТ и ДО ... от 0 до 99 = 100 строк (любых, если с удалением)
свои строки - это у потока 1 строки 12345 у потока 2 строки 6789, и они как бы привязаны..

короче, чтоб еще больше не вводить в заблуждение...
на скольких шаблонах отправка построена по базе именно с удалением и все прекрасно работает, раньше я тоже думал делать плюсовать .... херня это все, там гемора просто вагон + ничерта правильно по итогам не работает
я тебе говорю рабочий простой и действенный вариант на основе опыта
и не надо страдать дурью, запуская потоки в 2-5 секунд разницы, запустил сразу кучей и потоки сами берут то что надо

удаление работает очень просто, НЕ надо делить на диапазоны и прочую дурость. делаешь диапазон один ОТ и ДО и ставишь с удалением. КАДЫЙ поток возьмет СВОЙ диапазон

ТО ЕСТЬ конкретно на примере:

у тебя 10 потоков, каждый берет по 100 строк, всего 1000 строк

1 берет 100 строк и удаляет их
2 НЕ МОЖЕТ взять удаленные - это логично, НО он берет тоже диапазон 100 строк, НО для этого потока они уже новые, так как предыдущие удалены.
и со всеми потоками так же

в конце концов просто выдаст ошибку что файл пуст и все.. и уже с этим надо что-то делать, я просто перезаписываю файл из другого нужного файла из другой базы и все
 
  • Спасибо
Реакции: Ilshakin

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
639
Благодарностей
581
Баллы
93
Благодарю за отзывчивость....
Я прекрасно понимаю, что такое брать строки с удалением. Этот вариант НЕ подходит.
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
ну тогда только запись в конфиг через лок и взятие значений через лок, других вариков я не вижу
 
  • Спасибо
Реакции: Ilshakin

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
Во входных настройках.
А далее поочередно запустить 5 потоков, ну к примеру с разницей в 2 сек
Входные настройки:
а) Общий файл с почтами (или сразу разбить на нужное число частей)
б) Файл с номерами потоков, по умолчанию пустой

Примерная логика работы:
0) Прочитали сколько потоков будет (реально частей, т.к. мы не можем регулировать какой из них первый, какой нет)
1) Прочитали файл и разбили его на части с нужным количеством строк (c#), название файлов mail1.txt, mail2.txt, mail3.txt, mail4.txt
1.1) Если файлы есть, то идём далее.
2) Создали файл, из которого наш многопоток будет знать какой он по счету. Если поток берет последний номер, то перезаписывает его заново от 1 до 5.
3) Лочить процесс не обязательно, т.к. даже если их будет несколько, то они будут брать почты только из нужного файла. Профили так же.
4) Берем с удалением из нужного файла, если файл пуст, то или ничего не делаем, или помогаем соседям, через возврат к файлу определителю номера потока.

Более простая, но чуть более ресурсоемкая альтернатива, это использование таблицы.
1) Читаем количество
2) Создаем файл таблицы с нужной логикой (c#, excel с протяжкой вручную), который записываем на диск, 1 столбец почта, 2 номер потока - кто я. Исходя из логики в начале статьи, делаете сортировку, чтобы они шли 1 2 3 4 5, 1 2 3 4 5,
3) С удалением строк и проходим.

Третий вариант, батники
1) Выкидываем все настройки проекта описанные выше, они больше не нужны
2) Делаем батник или свою программу, которая через удобную формочку делит по папкам на нужные части
3) Отправляем отдельными копиями проекта в постер через бат файл, сколько раз делать, 1 поток. В папке все стандартно, настройки не нужны.

Чевертый вариант, через http сервер
За почты отвечает скрипт, который через браузер отдает почту и номер потока, куда положить результаты

Не зная задачи, не очень понятно, что и для чего. Скорее всего не хотите чтобы другие профили были или строки мешались, там задача проще.
 
  • Спасибо
Реакции: Ilshakin

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
С переходом на использование базы данных все вопросы решаются гораздо проще методами СУБД.
Также не брезгуйте использовать возможности глобальных переменных. Единственное, что тут не обойтись без C#, поскольку стандартными экшенами нельзя отследить инициализацию переменной.
Примеров в поиске по форуму масса. Поиском тоже брезговать не стоит :-)
 
  • Спасибо
Реакции: Ilshakin

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)