Многопоточность и работа со списком

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 763
Благодарностей
1 391
Баллы
113
Приветствую. Только вчера обновился до версии стандарт и теперь хочу разобьраться в создании многопоточных шаблонов. Почтиал рекомендации на форуме, везде советуют убрать цикл и работать со списком с привязанным файлом ... брать оттуда очередную строку с удалением и тогда другой поток будет брать уже новую строку. С этим вроде все ясно.

А если мне нужно что бы каждый поток брал из списка не одну строку, а скажем 100 строк ... в блоке действий со списком есть опция "Выделить подсписок" (можно с удвлением), как раз для моих целей подходит ... но не будет ли глюков у разных потоков с этим делом? То есть есть ли разница для многопотока брать по одной строке с удалением или выделять подсписок с удалением?

И еще ... если разные потоки будут работать (записывать) с одним файлом (логом), то он как-то на уровне потока блокируется на время работы? Чтобы не получилось так что несколько потоков одновременно пытаются писать в файл и в резульатте какие-то данные потеряются.

p.s может есть какой-нибудь мануал по многопотоку ... типа единый список рекомендаций?
 

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 453
Благодарностей
5 913
Баллы
113
Выделить подсписок - это будет каждый раз создаваться отдельный список. Для взятия нескольких строк лучше брать диапазон - http://zennolab.com/wiki/ru:ranges
Многопотока зря боитесь. Все отлажено с ним.
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 763
Благодарностей
1 391
Баллы
113
Ну мне в общем-то так и надо. Каждый поток берет из списка по N id-шников (с удалением) и в цикле производит с ними нужные действия (дергает страницы сайта). Мне как раз удобно что бы эти N id-шников так же лежали в списке.

p.s я многопотока не боюсь, у меня просто совсем нет опыта работы с ним ... я наоборот очень хочу с ним подружиться
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 763
Благодарностей
1 391
Баллы
113
Ох, камрады, что-то я совсем запутался с многопоточностью. В голове каша.

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

Могу ли я сделать так что бы допустим запустил я 5 потоков и каждый из них взял в "локальный" список по 10 id-шников и в цикле с ними работает ... и никакой другой поток в эти данные вклиниться не может, у каждого потока они свои. Такое возможно?

Очевидно что такое возможно если сделать 5 копий проекта и одновременно их запустить, но хотелось бы в одном все сделать.
 

Лев

Client
Регистрация
09.12.2014
Сообщения
290
Благодарностей
273
Баллы
63
создавай второй список, в который будешь складывать данные из первого, глобального, а второй список не привязывай ни к какому файлу, и он для каждого потока будет свой, локальный
 
  • Спасибо
Реакции: Iga

WebBot

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

Лев

Client
Регистрация
09.12.2014
Сообщения
290
Благодарностей
273
Баллы
63
ну да, правда у меня пока lite, я проверить не могу, но уверен =) Завтра, если никто не опровергнет, то значит точно так)
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 763
Благодарностей
1 391
Баллы
113
rostonix, спасибо.

И еще у меня такой вопрос: каким образом можно сообщить ZP что бы прекратил выполнение (убил все потоки). Вот допустим у меня выставлено 5 потоков и делать сказано 100500 раз (беру с огромным запасом). Каждый поток берет из списка (привязанного к файлу) по 100 строк ... рано или поздно строки заканчиваются ... очередной поток пытается взять 100 строк и никуда не попав по красному выходу завершается (поток убивается?) ... но при этом от 100500 раз еще остается 50000 ... и каждый раз каждый поток будет долбиться и умирать по красному выходу. Как бы сделать остановку в таком случае? Допустим посчитать кол-во неудач можно с помощью глобальной переменной (или файла со счетчиком) и при достижении, например, 10 неудачных попыток нужно как-то сообщить заннопостеру что надо все остановить. Вопрос в том как это сделать?
 

Ribas

Client
Регистрация
31.05.2014
Сообщения
1 440
Благодарностей
503
Баллы
113

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