Как сделать, чтобы многопоток только один раз использовал каждое из значений?

smartwisard

Client
Регистрация
17.01.2017
Сообщения
824
Благодарностей
82
Баллы
28
Это номера страниц, их может быть значительно больше.
Спарсив страницы, многопоток нормально работает, а вот перед работой каждую страницу каждый поток парсит.
0
45
90
135
180
225
270
315
360
405
450
495
540
585
630
675
720
765
810
855
900
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113

smartwisard

Client
Регистрация
17.01.2017
Сообщения
824
Благодарностей
82
Баллы
28
положить в список
Неа. Я пока не понял, как положить в список.
Я так понимаю, что каждый из потоков положит в список.
Т.е. первый поток положил в список, взял оттуда значение с удалением, и тут тебе на — второй поток кладёт туда то же самое и список восстановлен после удаления дублей.
 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
клади в список только если он пуст. Но по правильному это нужно дело через код используя лок
 
  • Спасибо
Реакции: smartwisard

smartwisard

Client
Регистрация
17.01.2017
Сообщения
824
Благодарностей
82
Баллы
28
Но ведь как только один поток оборвётся, шаблон запустит ещё один с самого начала, и он опять положит мне в список все значения ((
Или не так?
Код искать, видимо здесь https://zennolab.com/discussion/search/10782245/?q=список+многопоток&o=date&c[node]=16

А ещё буду соображать, можно ли задержать потоки паузой минуты на три, затем поставить удаление дублей в списке.
Или придётся значения вносить вручную.

Ушёл делать другие дела. Потом шаблон доделаю.
 
Последнее редактирование:

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 718
Благодарностей
1 376
Баллы
113

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 718
Благодарностей
1 376
Баллы
113

smartwisard

Client
Регистрация
17.01.2017
Сообщения
824
Благодарностей
82
Баллы
28
Код:
lock(SyncObjects.ListSyncer){
    if ( project.Lists["pages"].Count == 0 ){
        // тут нужно парсить номера страниц и добавлять их в список pages
    }
}
Отлично!
А что будет, если по-простому записать нужное в файле; привязать список без прав сохранять изменения в файл(не используя код), затем из списка брать с удалением?
Вдруг, как мне и надо, список будет синхронизироваться не раньше следующего запуска шаблона?
 
Последнее редактирование:

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 718
Благодарностей
1 376
Баллы
113
если будет без сохранения изменений, то это будет локальный список для каждого потока ... если один поток что-то оттуда возьмет с удалением, то другой поток об этом не узнает
 
  • Спасибо
Реакции: dio-dev и smartwisard

smartwisard

Client
Регистрация
17.01.2017
Сообщения
824
Благодарностей
82
Баллы
28
У меня очень слабо с пониманием кода.
Можете, пожалуйста вместо строки // тут надо парсить номера страниц и добавлять в список pages
уточнить, как внести произвольные номера 0, 45, 90, 135, 180 в список.
Вот я ошибся, конечно же:
Код:
lock(SyncObjects.ListSyncer){
    if ( project.Lists["pages"].Count == 0 ){0,45,90,135,180}
}
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 718
Благодарностей
1 376
Баллы
113
если без парсинга просто добавить строки в список pages

Код:
project.Lists["pages"].Add("0");
project.Lists["pages"].Add("45");
...
project.Lists["pages"].Add("180");
project.Lists["pages"].Count показывает сколько в данный момент строк в списке
 

smartwisard

Client
Регистрация
17.01.2017
Сообщения
824
Благодарностей
82
Баллы
28
Проверил, вносит. Отлично, так и код можно выучить.
Код:
lock(SyncObjects.ListSyncer){
    if ( project.Lists["pages"].Count == 0 ){
project.Lists["pages"].Add("0");
project.Lists["pages"].Add("45");
project.Lists["pages"].Add("90");
project.Lists["pages"].Add("135");
project.Lists["pages"].Add("180");
    }
}
 
Последнее редактирование:

smartwisard

Client
Регистрация
17.01.2017
Сообщения
824
Благодарностей
82
Баллы
28
Прочёл код (английский я понимаю) и проверил, что он делает.
Я не ошибся? Как только список становится пустым, следующий поток опять может его наполнить?
(Я уже придумал, какой костыль приделать, чтобы список один раз наполнялся за всё действие шаблона.)
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 718
Благодарностей
1 376
Баллы
113
В один момент времени только 1 поток может выполнять то что находится внутри лока ... остальные ждут
То есть при старте, когда список пуст, какой-то поток обязательно будет первым и будет выполнять код внутри лока ... остальные потоки будут ждать
Этот первый поток внутри лока проверит кол-во строк в списке и если оно равно нулю, то наполнит список .... Наполнил, из лока вышел.
Далее какой-то следующий поток который был в ожидании (условный второй) начинает выполнять то что внутри лока ... так же проверяет кол-во строк в списке, но список уже не пустой (первой поток его наполнил), поэтому он наполнять не будет и просто пойдет дальше ... остальные так же
 

smartwisard

Client
Регистрация
17.01.2017
Сообщения
824
Благодарностей
82
Баллы
28
Понятно. Значит в данном случае строчка IF в коде мне не нужна.
Bсего один раз надо наполнять. Потому я сейчас приделаю глобальную переменную и внесу в неё 1 после наполнения списка, а перед списком потоки будут в случае переменной, равной 1, идти в обход.
Подскажите, пожалуйста, как мне сделать не обычную, а глобальную переменную?
Я здесь https://zennolab.com/discussion/threads/otdelnoe-zadanie-dlja-opredelennogo-potoka.52819/ прочёл, что так можно.


P.S. Ваш кубик кода первый, который я понял полностью, от и до! Уряяяя!
 

Vass

Client
Регистрация
03.02.2014
Сообщения
79
Благодарностей
10
Баллы
8
а почему не изменить логику? сначала собрать в 1 поток, а потом уже обработку в много-потоке?

В постере есть вкладка глобальная переменная и там + добавить переменную.
 

smartwisard

Client
Регистрация
17.01.2017
Сообщения
824
Благодарностей
82
Баллы
28
Ну да, я тоже подумал, что можно разделить на два шаблона и однопоточный, собрав ссылки, будет через бат файл запускать многопоточный.
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 718
Благодарностей
1 376
Баллы
113
Зачем?
Выше ведь решение что бы все работало в многопоточном режиме ... первый поток наполнит список из которого все потоки будут брать строки с удалением. Все в одном шаблоне.
 

smartwisard

Client
Регистрация
17.01.2017
Сообщения
824
Благодарностей
82
Баллы
28
Просто список надо наполнять один-единственный раз и больше ни разу не наполнять.
Если бы в шаблончике сделать переменную для всех потоков, то он будет работать.

Ниже на выбор ссылка на шаблон ростоникса, первый кубик которого я использовал
https://zennolab.com/discussion/threads/mnogopotok-prostoj-primer.15888/page-2#post-97413
и мой шаблон для наполнения списка в многопотоке.
Чтобы вам стало совсем трудно, см. также https://zennolab.com/discussion/threads/trudnosti-s-globalnoj-peremennoj.36665
 

Вложения

Последнее редактирование:

smartwisard

Client
Регистрация
17.01.2017
Сообщения
824
Благодарностей
82
Баллы
28
Я хотел, чтобы данные со страниц собирались только один раз.
Мои попытки усложнить код разными кубиками, глобальными переменными мне не помогли.
Как бы я ни делал, если список становится пуст, следующий поток его наполняет и второй раз собираются данные со страниц, что мне не нужно.

Становлюсь на колени и признаю этот код самым кратким и совершенным ))

WebBot's post:
Код:
lock(SyncObjects.ListSyncer){
    if ( project.Lists["pages"].Count == 0 ){
[*]project.Lists["pages"].Add("0");
[*]project.Lists["pages"].Add("45");
[*]project.Lists["pages"].Add("90");
[*]project.Lists["pages"].Add("135");
        // тут нужно парсить номера страниц и добавлять их в список pages
    }
}
И список должен быть привязан к файлу и сохранять изменения в файл! Иначе работать не будет ....
 
Последнее редактирование:

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 718
Благодарностей
1 376
Баллы
113
там где заполняется список нужно установить глобальную переменную
project.GlobalVariables.SetVariable("[email protected]","flag","1");

так же в условие наполнения списка (кроме количества строк равного 0) нужно добавить проверку этой переменной
 
  • Спасибо
Реакции: smartwisard

smartwisard

Client
Регистрация
17.01.2017
Сообщения
824
Благодарностей
82
Баллы
28
У меня парсер. Потому я так и не использовал код.
Не преодолел, если многопоток пустой список наполняет заново номерами страниц и парсит второй раз.
Для меня код сниппета — верх совершенства. Улучшить его мне никогда не удастся. Но пустой список он наполняет заново.
Вот я и не знаю, как в многопотоке наполнить список номерами страниц 0,1,2,3,...,20 единственный раз.
Сейчас читаю https://zennolab.com/discussion/threads/rabota-so-spiskom-v-mnogopotoke.48345/
 
Последнее редактирование:

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