Многопоточность при работе с таблицей

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
Сижу, ломаю голову. Вроде бы когда то задавался подобным вопросом, но уже не вспомню решения. Шаблон работает с таблицей. Берет строку с данными, обрабатывает их и кладет обратно в конец таблиц. Пред стартом, полаю кол-во строк и по счетчику контролирую когда останавливаться. После цикла, отнимается значение в кол-ве строк и доходя да 0 заканчиваем работу.

Подскажите логику для много потока. Ничего толкового пока в голову не приходит.
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 789
Благодарностей
1 954
Баллы
113

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113

radv

Client
Регистрация
11.05.2015
Сообщения
3 789
Благодарностей
1 954
Баллы
113
Не о локах пока речь. Нужно что бы сколько потоков не выставил, обработка таблицы корректно заканчивалась а не шла по кругу.
так используй глобальный счетчик, который общий для всех потоков. Ну или метку какую нибудь по началу/завершению обработки таблицы. Про глобальные переменные тоже уже было в стаьях на форуме.
 

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
так используй глобальный счетчик, который общий для всех потоков. Ну или метку какую нибудь по началу/завершению обработки таблицы. Про глобальные переменные тоже уже было в стаьях на форуме.
Глобальная переменная при запуске потока как мне помниться обнуляется.
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 789
Благодарностей
1 954
Баллы
113

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
Последнее редактирование:

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 453
Баллы
113
На сколько я понял - есть шаблон.
На вход подается два значения x, y, одно из которых говорит сколько именно строк должен обработать один поток, второе значение говорит сколько строк должны обработать все потоки вместе до остановки.
Далее шаблон стартует например в 100 потоков.
И крутится в цикле по первому значению (увеличил счётчик первого числа, уменьшил счётчик второго числа, если первое число больше указанного - завершили работу потока, если второе значение == 0 завершили работу потока, иначе взял строку, обработал, вернул обратно).
Так вот, второе значение - это явно глобальная переменная, которая должна быть видна для каждого потока, при первой инициализации ей нужно присвоить значение с входящих настроек, и потом уменьшать на 1.

Но, нужно как-то предусмотреть вариант когда мы решили ещё раз выполнить шаблон на обработку всей таблицы в многопотоке (нужно сбросить значение глобальной снова на указанное значение).

Работу с таблицей (взять, добавить ) нужно вести в локе, работу с глобалкой (создать, установить, получить) - также в локе.
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 789
Благодарностей
1 954
Баллы
113

backoff

Client
Регистрация
20.04.2015
Сообщения
6 054
Благодарностей
6 482
Баллы
113
Подскажите логику для много потока. Ничего толкового пока в голову не приходит.
Самый на мой взгляд простой и рабочий способ, который я юзаю до сих пор, и он не подводил еще, без локов и смс )))
Добавь еще один столбец "status" и проверяй на него
То есть взял строку, и сразу ее перезаписал со статусом "work", закончил, перезаписал на "done" good, ok и тд
Статусы увеличивают разнообразие действий со строкой.
ну а в конце, контрольная проверка всей таблицы на определенный статус, если такой строки нет, то значит выключаем шаблон

ps \ хотя нет, перезапись лучше делать в локе )))
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 418
Благодарностей
5 454
Баллы
113
Самый на мой взгляд простой и рабочий способ, который я юзаю до сих пор, и он не подводил еще, без локов и смс )))
Добавь еще один столбец "status" и проверяй на него
То есть взял строку, и сразу ее перезаписал со статусом "work", закончил, перезаписал на "done" good, ok и тд
Статусы увеличивают разнообразие действий со строкой.
ну а в конце, контрольная проверка всей таблицы на определенный статус, если такой строки нет, то значит выключаем шаблон

ps \ хотя нет, перезапись лучше делать в локе )))
Согласен статусы решают. Но конечно все это надо на C# делать в локе. Как только взяли нужную строку, сразу статус меняем. И уже делаем что нужно. Так что можно поиском по таблице пользоваться. Заморочился сделал один раз, и работает отлично.
 
  • Спасибо
Реакции: one

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
На вход подается два значения x, y, одно из которых говорит сколько именно строк должен обработать один поток, второе значение говорит сколько строк должны обработать все потоки вместе до остановки.
Далее шаблон стартует например в 100 потоков.
Немного не так. В таблице Х строк их количество не постоянно. Периодически меняется. Шаблон будет работать в Y потоков. Тут тоже будет думаю значение меняться если надо будет быстро обработать таблицу. Надо что бы Y потоков отработал X строк однократно и остановился. т.е. Y должен уменьшать Х и при нулевом значении останавливалась работа шаблона не запуская новых потоков тем самым не вывод на повторную обработку строк.

Каждый новый поток обнуляет глобальную переменную и мы уйдем на начало.
 

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
Да, это уже что надо.
ну а в конце, контрольная проверка всей таблицы на определенный статус, если такой строки нет, то значит выключаем шаблон
Вот как определить что уже конец и обнулить статусы для последующего запуска шаблона по расписанию?
 

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
Согласен статусы решают. Но конечно все это надо на C# делать в локе. Как только взяли нужную строку, сразу статус меняем. И уже делаем что нужно. Так что можно поиском по таблице пользоваться. Заморочился сделал один раз, и работает отлично.
Так... А ведь пишут что обычный экшен для работы с таблицами лочит ее при работе с ней. Разьве нет?
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 054
Благодарностей
6 482
Баллы
113
Вот как определить что уже конец и обнулить статусы для последующего запуска шаблона по расписанию?
так у тебя в процессе работы статусы должны меняться.
то есть ты взял строку, дал статув - в работе, когда закончил с ней работать, дал статус - выполнено
и в конце каждого выполнения проверяешь, если есть еще таблицы в статусе "work", то ничего не делаем - работаем дальше, а если таких нет, то запускаем батник, который принудительно останавливает шаблон, если он стоит на "-1" потоках, ЛИБО, я так тоже делаю, просто добавляю +10 выполнений, чтоб наверняка

нет
 
  • Спасибо
Реакции: one

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
так у тебя в процессе работы статусы должны меняться.
то есть ты взял строку, дал статув - в работе, когда закончил с ней работать, дал статус - выполнено
и в конце каждого выполнения проверяешь, если есть еще таблицы в статусе "work", то ничего не делаем - работаем дальше, а если таких нет, то запускаем батник, который принудительно останавливает шаблон, если он стоит на "-1" потоках, ЛИБО, я так тоже делаю, просто добавляю +10 выполнений, чтоб наверняка


нет
Не поделишься снипетом для примера?
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113
Еще такой вариант на выбор:
Брать из таблицы с удалением, обрабатывать и записывать в новый файл. Все в локе, разумеется. Последним потоком переименовываем новый файл в старый.
 
  • Спасибо
Реакции: one

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113
Зачем такие сложности, и такая нагрузка, при много потоке когда записываешь в таблицу и берешь из таблицы, будет нагрузка, таблица и список, в списке тоже самое что и в таблице, из списка взял строку с удалением, потом берешь из таблицы строку содержащею текст (без удаления) проходишь весь список в конце он пустой.
 

backoff

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

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 103
Благодарностей
132
Баллы
63
Зачем такие сложности, и такая нагрузка, при много потоке когда записываешь в таблицу и берешь из таблицы, будет нагрузка, таблица и список, в списке тоже самое что и в таблице, из списка взял строку с удалением, потом берешь из таблицы строку содержащею текст (без удаления) проходишь весь список в конце он пустой.
а подробнее можно?
 

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113
а подробнее можно?
Какие тут подробности, сделай таблицу с 10 - строками, бери с удалением и сразу записывай в конец, и включи потоков 20, ты в шоке будешь от нагрузки.
Делаешь таблицу, и список, со списка берешь строку с удалением, а с таблицы без удаления, содержащие текст или по регулярке.
 

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 103
Благодарностей
132
Баллы
63
Какие тут подробности, сделай таблицу с 10 - строками, бери с удалением и сразу записывай в конец, и включи потоков 20, ты в шоке будешь от нагрузки.
Делаешь таблицу, и список, со списка берешь строку с удалением, а с таблицы без удаления, содержащие текст или по регулярке.
Ну прости туплю. Как таблица связана со списком. Т.е. из таблицы строку в список - из списка строка в работу - отработанная в конец списка и опять в таблицу? Можно пример? В шаблоне. Чувствую, что нужный момент и если сейчас не разберусь, уйдет мимо. Кто-то понял?
 

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113
Ну прости туплю. Как таблица связана со списком. Т.е. из таблицы строку в список - из списка строка в работу - отработанная в конец списка и опять в таблицу? Можно пример? В шаблоне. Чувствую, что нужный момент и если сейчас не разберусь, уйдет мимо. Кто-то понял?
Пример что я имел ввиду
 

Вложения

  • Спасибо
Реакции: bizzon

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
Вообщем опишу свое решение которое в итоге родилось. Спасибо @doc за помощь со снипетом и @sergodjan66 за примеры с шаблонами! Пока обкатываю, тестирую, склеиваю все в одно целое.

Добавляем в таблицу колонку STATUS.

Туда пишем:
0 - свободно
1 - занято

По умолчанию (для новых строк) 0.

Сама процедура:

(Описываю работу на примере одного потока)

Что бы не уйти в вечный цикл данное решение реализовано двумя шаблонами с использованием локов и планируется запускать их в Диспетчере заданий поочередно.

1й шаблон.
  • Берем с удалением первую строку со статусом 0.
  • Выполняем нужное с полученными данными.
  • Записываем результат обратно в конец таблицы со статусом 1.
  • При отсутствии строк со статусом 0 останавливаемся по Good.

2й шаблон.
  • Сбрасываем статус у всех строк в таблице на 0.
 
Последнее редактирование:

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
можно не удалять строки. просто в эту строку в поле STATUS ставить 1 и после заполнения данных ставить 0.
 
  • Спасибо
Реакции: one

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
можно не удалять строки. просто в эту строку в поле STATUS ставить 1 и после заполнения данных ставить 0.
Да, можно и так, но тогда процедура записи обработанных данных усложняется поиском нужной строки. Надо найти и записать а в моем варианте только записать.
 

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 103
Благодарностей
132
Баллы
63

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113

backoff

Client
Регистрация
20.04.2015
Сообщения
6 054
Благодарностей
6 482
Баллы
113
  • Спасибо
Реакции: one

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
@backoff бля, дружище, про тебя забыл. Сорян! С меня пивас при встречи! Тебе тоже спасибо большое! Да всем кого пропустил. Уставший за эти дни немного.
 
  • Спасибо
Реакции: Sergodjan и backoff

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