Работа со списком в многопотоке

Dima_External

Пользователь
Регистрация
23.10.2017
Сообщения
75
Благодарностей
4
Баллы
8
Приветствую!

Как правильно организовать взятие строки из списка по ее номеру, но в многопотоке?
В списке 50 строк, каждая строка должна проработать в цикле (без повторов) и шаблон должен завершить работу если все строки были проверены.

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

Как я понимаю, это делать нужно через глобальную переменную, получить кол-во строк в списке и внутри глобальной выставлять значение для номера строки.
В коде не силен, кто может помочь?
 

kapelan28

Client
Регистрация
22.09.2015
Сообщения
469
Благодарностей
185
Баллы
43
Приветствую!

Как правильно организовать взятие строки из списка по ее номеру, но в многопотоке?
В списке 50 строк, каждая строка должна проработать в цикле (без повторов) и шаблон должен завершить работу если все строки были проверены.

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

Как я понимаю, это делать нужно через глобальную переменную, получить кол-во строк в списке и внутри глобальной выставлять значение для номера строки.
В коде не силен, кто может помочь?
Если список со строками будет еще нужен, то можно или вручную его копировать (до начала работы) или делать в шаблоне так - берем строку из списка с удалением, тут же сохраняем ее в другой список и выполняем цикл. Основной список будет уменьшаться с каждым выполнением. А в логике добавьте проверку - если количество строк равно нулю, то прерываем работу.
Да, и это решается как стандартными кубиками, так и C# кодом.
 

Dima_External

Пользователь
Регистрация
23.10.2017
Сообщения
75
Благодарностей
4
Баллы
8
Если список со строками будет еще нужен, то можно или вручную его копировать (до начала работы) или делать в шаблоне так - берем строку из списка с удалением, тут же сохраняем ее в другой список и выполняем цикл. Основной список будет уменьшаться с каждым выполнением. А в логике добавьте проверку - если количество строк равно нулю, то прерываем работу.
Да, и это решается как стандартными кубиками, так и C# кодом.

Это не будет работать корректно, т.к. один поток может закончить работу раньше другого и переназначить списки, а последующий произведет добавление во временный
 

kapelan28

Client
Регистрация
22.09.2015
Сообщения
469
Благодарностей
185
Баллы
43
Это не будет работать корректно, т.к. один поток может закончить работу раньше другого и переназначить списки, а последующий произведет добавление во временный
не пойму - при чем тут временный список?
Последовательность действий - есть файл со строками, берем из него по 1 строке с удалением (при необходимости копируем взятую строку в резервный файл), отрабатываем нужную операцию с этой строкой, завершаем работу потока. Каждый поток будет брать уникальную строку, тут все корректно работает, если логику работу составить нормально.
 

Dima_External

Пользователь
Регистрация
23.10.2017
Сообщения
75
Благодарностей
4
Баллы
8
Берем строку с удалением - кладем в резервный файл - идем на цикл.
Если строку взять не получается - копируем строки из резервного в главный, резервный чистим, так?
 

kapelan28

Client
Регистрация
22.09.2015
Сообщения
469
Благодарностей
185
Баллы
43
Берем строку с удалением - кладем в резервный файл - идем на цикл.
Если строку взять не получается - копируем строки из резервного в главный, резервный чистим, так?
нет, резервный список нужен (если вообще нужен) только для того, если строки из основного файла нужны будут для повторного выполнения. Если нет - то не нужно создавать резервный файл.
Если строку взять не получается
то прерываем выполнение работы, потому что файл пустой.
 

Dima_External

Пользователь
Регистрация
23.10.2017
Сообщения
75
Благодарностей
4
Баллы
8
Мне строки нужны для повторного выполнения.
Но все равно это работает некорректно
 

Dima_External

Пользователь
Регистрация
23.10.2017
Сообщения
75
Благодарностей
4
Баллы
8
нет, резервный список нужен (если вообще нужен) только для того, если строки из основного файла нужны будут для повторного выполнения. Если нет - то не нужно создавать резервный файл.

то прерываем выполнение работы, потому что файл пустой.
http://uploads.ru/hm6D8.png
http://uploads.ru/SMa6W.png

вот даже по логу видно
 

kapelan28

Client
Регистрация
22.09.2015
Сообщения
469
Благодарностей
185
Баллы
43
если честно, то я тут ничего не понял. Какие используются настройки для Списка? галочки брать из файла, сохранять изменения и оставлять файл пустым стоят? А если изменения не сохраняются, то тогда о какой корректной работе может идти речь?
Теперь по временному списку и многопотоку - временный список (без привязки и сохранения в файл) в многопотоке будет работать отдельно для каждого потока (они не будут никак пересекаться/объединяться). Так что от такого списка пользы мало.
 

spesy

Активный пользователь
Регистрация
08.08.2016
Сообщения
161
Благодарностей
168
Баллы
43
да со списками гемор будет. Надо брать строку под номером, номер в отдельный файл, типа глобальной переменной, каждый поток будет её увеличивать. А лучше всего всё сделать внутри шаблона без ограничений на количество потоков.
 

smartwisard

Client
Регистрация
17.01.2017
Сообщения
825
Благодарностей
81
Баллы
28
Я так и сделал — вручную кладу ссылки на страницы в список. Шабов у меня два. Смысл первого — спарсить ссылки со страниц. Парсит собранные ссылки второй, гораздо более сложный шаб.
Когда первый собрал ссылки со страниц, список страниц остаётся пуст. Но всё подготовлено для второго шаба.
Запускается второй шаб. Что мне стоит в конце второго шаба приделать наполнениe списка со страницами для первого шаба? Ничего не стоит. Я так и сделаю.
Многопоток перед смертью наполнит его несколько раз? Все знают, как из списка удалить дубли.



Т.е. добавить в конце второго шаба обработкой текста наполнить список страниц для первого + удалить дубли.
Сделав для первого шаба расписание и добавив в конце бат-файл для второго, можно о парсере забыть.


У меня всё.
 
Последнее редактирование:

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