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

  • Автор темы Автор темы smartwisard
  • Дата начала Дата начала

smartwisard

Client
Регистрация
17.01.2017
Сообщения
824
Реакции
83
Баллы
28
Это номера страниц, их может быть значительно больше.
Спарсив страницы, многопоток нормально работает, а вот перед работой каждую страницу каждый поток парсит.
0
45
90
135
180
225
270
315
360
405
450
495
540
585
630
675
720
765
810
855
900
 
положить в список
Неа. Я пока не понял, как положить в список.
Я так понимаю, что каждый из потоков положит в список.
Т.е. первый поток положил в список, взял оттуда значение с удалением, и тут тебе на — второй поток кладёт туда то же самое и список восстановлен после удаления дублей.
 
Последнее редактирование:
Но ведь как только один поток оборвётся, шаблон запустит ещё один с самого начала, и он опять положит мне в список все значения ((
Или не так?
Код искать, видимо здесь https://zennolab.com/discussion/search/10782245/?q=список+многопоток&o=date&c[node]=16

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

Ушёл делать другие дела. Потом шаблон доделаю.
 
Последнее редактирование:
Код:
Развернуть Свернуть Копировать
lock(SyncObjects.ListSyncer){
    if ( project.Lists["pages"].Count == 0 ){
        // тут нужно парсить номера страниц и добавлять их в список pages  
    }
}
 
  • Оценить
Реакции: dio-dev и smartwisard
Код:
Развернуть Свернуть Копировать
lock(SyncObjects.ListSyncer){
    if ( project.Lists["pages"].Count == 0 ){
        // тут нужно парсить номера страниц и добавлять их в список pages
    }
}
Отлично!
А что будет, если по-простому записать нужное в файле; привязать список без прав сохранять изменения в файл(не используя код), затем из списка брать с удалением?
Вдруг, как мне и надо, список будет синхронизироваться не раньше следующего запуска шаблона?
 
Последнее редактирование:
если будет без сохранения изменений, то это будет локальный список для каждого потока ... если один поток что-то оттуда возьмет с удалением, то другой поток об этом не узнает
 
  • Оценить
Реакции: dio-dev и smartwisard
У меня очень слабо с пониманием кода.
Можете, пожалуйста вместо строки // тут надо парсить номера страниц и добавлять в список pages
уточнить, как внести произвольные номера 0, 45, 90, 135, 180 в список.
Вот я ошибся, конечно же:
Код:
Развернуть Свернуть Копировать
lock(SyncObjects.ListSyncer){
    if ( project.Lists["pages"].Count == 0 ){0,45,90,135,180}
}
 
если без парсинга просто добавить строки в список pages

Код:
Развернуть Свернуть Копировать
project.Lists["pages"].Add("0");
project.Lists["pages"].Add("45");
...
project.Lists["pages"].Add("180");

project.Lists["pages"].Count показывает сколько в данный момент строк в списке
 
Проверил, вносит. Отлично, так и код можно выучить.
Код:
Развернуть Свернуть Копировать
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");
    }
}
 
Последнее редактирование:
Прочёл код (английский я понимаю) и проверил, что он делает.
Я не ошибся? Как только список становится пустым, следующий поток опять может его наполнить?
(Я уже придумал, какой костыль приделать, чтобы список один раз наполнялся за всё действие шаблона.)
 
В один момент времени только 1 поток может выполнять то что находится внутри лока ... остальные ждут
То есть при старте, когда список пуст, какой-то поток обязательно будет первым и будет выполнять код внутри лока ... остальные потоки будут ждать
Этот первый поток внутри лока проверит кол-во строк в списке и если оно равно нулю, то наполнит список .... Наполнил, из лока вышел.
Далее какой-то следующий поток который был в ожидании (условный второй) начинает выполнять то что внутри лока ... так же проверяет кол-во строк в списке, но список уже не пустой (первой поток его наполнил), поэтому он наполнять не будет и просто пойдет дальше ... остальные так же
 
Понятно. Значит в данном случае строчка IF в коде мне не нужна.
Bсего один раз надо наполнять. Потому я сейчас приделаю глобальную переменную и внесу в неё 1 после наполнения списка, а перед списком потоки будут в случае переменной, равной 1, идти в обход.
Подскажите, пожалуйста, как мне сделать не обычную, а глобальную переменную?
Я здесь https://zennolab.com/discussion/threads/otdelnoe-zadanie-dlja-opredelennogo-potoka.52819/ прочёл, что так можно.


P.S. Ваш кубик кода первый, который я понял полностью, от и до! Уряяяя!
 
а почему не изменить логику? сначала собрать в 1 поток, а потом уже обработку в много-потоке?

В постере есть вкладка глобальная переменная и там + добавить переменную.
 
Ну да, я тоже подумал, что можно разделить на два шаблона и однопоточный, собрав ссылки, будет через бат файл запускать многопоточный.
 
Зачем?
Выше ведь решение что бы все работало в многопоточном режиме ... первый поток наполнит список из которого все потоки будут брать строки с удалением. Все в одном шаблоне.
 
Просто список надо наполнять один-единственный раз и больше ни разу не наполнять.
Если бы в шаблончике сделать переменную для всех потоков, то он будет работать.

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

Вложения

Последнее редактирование:
Я хотел, чтобы данные со страниц собирались только один раз.
Мои попытки усложнить код разными кубиками, глобальными переменными мне не помогли.
Как бы я ни делал, если список становится пуст, следующий поток его наполняет и второй раз собираются данные со страниц, что мне не нужно.

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

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
    }
}
И список должен быть привязан к файлу и сохранять изменения в файл! Иначе работать не будет ....
 
Последнее редактирование:
там где заполняется список нужно установить глобальную переменную
project.GlobalVariables.SetVariable("vasia@pupkin.com","flag","1");

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

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