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

Discussion in 'Вопросы новичков' started by Ilshakin, Mar 17, 2019.

  1. Ilshakin

    Ilshakin Client

    Joined:
    Feb 14, 2017
    Messages:
    64
    Likes Received:
    13
    Возможно ли такое реализовать ?

    Есть файл, в котором лежат 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 строк
     
    Last edited: Mar 17, 2019
  2. specialist

    specialist Client

    Joined:
    Dec 28, 2018
    Messages:
    279
    Likes Received:
    75
    Задаёте где?
     
  3. backoff

    backoff Client

    Joined:
    Apr 20, 2015
    Messages:
    2,717
    Likes Received:
    2,057
    1. бери с удалением и неи мозги
    2. делай конфиг файл где будет указано какой номер в данный момент используется и лочить потоки при обращении к конфигу
    3. использовать глобальные переменные (я до сих пор хз как они работают :-) )

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

    Ilshakin Client

    Joined:
    Feb 14, 2017
    Messages:
    64
    Likes Received:
    13
    Во входных настройках.
    А далее поочередно запустить 5 потоков, ну к примеру с разницей в 2 сек
     
  5. Ilshakin

    Ilshakin Client

    Joined:
    Feb 14, 2017
    Messages:
    64
    Likes Received:
    13
    Вариант с удалением строк не подходит
     
  6. backoff

    backoff Client

    Joined:
    Apr 20, 2015
    Messages:
    2,717
    Likes Received:
    2,057
    чем?
     
  7. Ilshakin

    Ilshakin Client

    Joined:
    Feb 14, 2017
    Messages:
    64
    Likes Received:
    13
    Несколько десятков шаблонов обращаются к одному файлу, с разницей в 1 сек.
    У каждого шаблона свой диапазон. Удаление не подходит никак
     
  8. backoff

    backoff Client

    Joined:
    Apr 20, 2015
    Messages:
    2,717
    Likes Received:
    2,057
    да хоть миллион шаблонов
    при удалении КАЖДЫЙ шаблон будет брать свою пачку строк. ЕСЛИ не нужно чтоб у каждого шаблона были именно свои строки в этой базе, тогда не подойдет.
    а если брать просто новые строки для отправки, то еще как подойдет
    ну в общем ладно, не подходит значит не подхоит
     
  9. Ilshakin

    Ilshakin Client

    Joined:
    Feb 14, 2017
    Messages:
    64
    Likes Received:
    13
    Попробовал сделать такой вот костыль, но проблему многопотока он все равно не решит:
    [​IMG]

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

    Ilshakin Client

    Joined:
    Feb 14, 2017
    Messages:
    64
    Likes Received:
    13
    нужно чтоб у каждого шаблона были именно свои строки (диапазон)
     
    Last edited: Mar 17, 2019
  11. backoff

    backoff Client

    Joined:
    Apr 20, 2015
    Messages:
    2,717
    Likes Received:
    2,057
    диапазон и свои строки - это разные вещи
    диапазон - это ОТ и ДО ... от 0 до 99 = 100 строк (любых, если с удалением)
    свои строки - это у потока 1 строки 12345 у потока 2 строки 6789, и они как бы привязаны..

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

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

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

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

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

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

    Ilshakin Client

    Joined:
    Feb 14, 2017
    Messages:
    64
    Likes Received:
    13
    Благодарю за отзывчивость....
    Я прекрасно понимаю, что такое брать строки с удалением. Этот вариант НЕ подходит.
     
  13. backoff

    backoff Client

    Joined:
    Apr 20, 2015
    Messages:
    2,717
    Likes Received:
    2,057
    ну тогда только запись в конфиг через лок и взятие значений через лок, других вариков я не вижу
     
    Ilshakin likes this.
  14. specialist

    specialist Client

    Joined:
    Dec 28, 2018
    Messages:
    279
    Likes Received:
    75
    Входные настройки:
    а) Общий файл с почтами (или сразу разбить на нужное число частей)
    б) Файл с номерами потоков, по умолчанию пустой

    Примерная логика работы:
    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 likes this.
  15. zortexx

    zortexx Client

    Joined:
    Sep 19, 2011
    Messages:
    2,066
    Likes Received:
    882
    С переходом на использование базы данных все вопросы решаются гораздо проще методами СУБД.
    Также не брезгуйте использовать возможности глобальных переменных. Единственное, что тут не обойтись без C#, поскольку стандартными экшенами нельзя отследить инициализацию переменной.
    Примеров в поиске по форуму масса. Поиском тоже брезговать не стоит :-)
     
    Ilshakin likes this.

Пользователи просматривающие тему (Пользователей: 0, Гостей: 0)