Грамотная работа с многопоточностью.

PainShaft

Client
Регистрация
28.08.2013
Сообщения
38
Благодарностей
6
Баллы
8
Часто возникает проблема с оптимальным решением многопоточности. Как пример мы заходим под одним логином на сайте и нужно выполнить определенные действия, но в несколько потоков, т.е. нажать на определенную область и изменить там значение, как грамотно сделать так чтобы, действия в потоках не повторялись? Т.е. чтобы каждый поток заходил и нажимал на уникальную ему область и изменял значение?
Интересно решение без удаления строк...
 

dimon2006

Client
Регистрация
31.05.2012
Сообщения
10
Благодарностей
0
Баллы
1
каждая область имеет свою переменную. задай рандомом назначение переменных и вставляй их в урл области. например у меня так постит в форумы
http://ssmaker.ru/61eff5ec/
 

PainShaft

Client
Регистрация
28.08.2013
Сообщения
38
Благодарностей
6
Баллы
8
каждая область имеет свою переменную. задай рандомом назначение переменных и вставляй их в урл области. например у меня так постит в форумы
http://ssmaker.ru/61eff5ec/
Да вариант, но нужно более осмысленно чем рандом, ибо работа заключается не просто чтобы куда запостить/кликнуть/вставить, а именно пройтись по всем нужным значениям.
 

rostonix

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

PainShaft

Client
Регистрация
28.08.2013
Сообщения
38
Благодарностей
6
Баллы
8
Да так и знал что не совсем понятно будет :-) Если точнее каждый поток проходит то что уже делал поток до него, а мне надо чтобы каждый поток пропускал то что уже сделано. Ну вот например ставим 10 потоков и заходим на аккаунт, у нас есть 10 полей для вставки числа, вот надо чтобы каждый поток не проходил все поля со значениями , а вставил всего в одно ему предназначенное, если так можно сказать, т.е. один поток сделал одно действие, а не 10.
 

PainShaft

Client
Регистрация
28.08.2013
Сообщения
38
Благодарностей
6
Баллы
8
Ясно, решил как всегда сам, глобальными переменными...
 

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8
Тоже интересует данный вопрос.
Я так понимаю глобальные переменные удобны для обмена информации между разными запущенными проектами, не в смысле многопоточности, а в смысле действительно разные проекты.
Возможно ли это реализовать без глобальных переменных? Просто работа с листом через обычную переменную, если лист прикреплен к файлу, где каждая ссылка новая строка. Если брать строку с удалением из файла на обработку.
Пытался сделать в таком духе, тоже получалось, что по несколько раз выполнялись одинаковые действия в разных потоках. Может конечно невнимательность, а может и правда надо работать только через глобальные переменные?
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
Просто работа с листом через обычную переменную, если лист прикреплен к файлу, где каждая ссылка новая строка. Если брать строку с удалением из файла на обработку.
Если список связан с файлом, то взятие строки с удалением строку заберет. И другие потоки ее не увидят.
 
  • Спасибо
Реакции: kodzero

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8
Верно ли сделал настройки списка, который прикрепил к файлу? 1f4811da6f09.jpg

При запуске проекта на многопоточности, файл которые закреплен за списком в проекте жутко раздувается, ну и все что в него попало проект выполняет.
Мои предположения, что вся информация, которая попала в список в отдельном потоке заносится обратно в файл. Не знаю как устроенно в С# и PHP, но вот в Перле роль этих списковов выполняют некие дескрипторы. Дак вот получается, что каждый дискриптор в каждом потоке возвращается в файл, тоесть сколько выставленно потоков столько раз список запишется в файл, ну и файл раздувается больше чем требуется. Нужно всего один раз вернуть список с которым работаем в файл.
Как правильнее решить эту проблему, наверника все просто?
Конечно можно перед работой с файлом взять колличество его строк, выстовить счетчик и как он закончится остановить проет.
Но может есть более правильное решение, чтобы этот список не множился в файл пропорционально выстовленному колличеству потоков?

P.S.
Подумал, колличество строк не решит вопрос, так как это будет колличество циклов для каждого потока в отдельности. В общем выполнится весь дутый файл.
 

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8
Напишу более простостым языком.

Там при настройке списка, если поставить чекбокс - Сохранять изменения списка в файл, то список на одном потоке копируется в файл. Если этот проект запуститьв ЗенноПостере и поставить 2 потока, то список который сфомировался в первом потоке копируется в файл и список который сформировался во втором потоке копируется в файл, получается в файл заносится список два раза. Сответственное если поставить 3 потока, то файл раздувается трижды и т.д.

Стоит ZP - v.5.0.4.1
 

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 450
Благодарностей
1 880
Баллы
113
Так а что должно быть? Скорее всего у вас просто неправильно настроена логика шаблона. Нужен проект, чтобы понять что он должен делать и что там не так.
 
  • Спасибо
Реакции: kodzero

Kopch

Client
Регистрация
28.09.2013
Сообщения
28
Благодарностей
3
Баллы
3
Я так понял во время выполнения проекта, в список с n строк добавляется строка k и список пишется в файл (привязан к файлу)
в одном потоке запись в файл идет n+k, в 2-х потоках получается n+k+n+c, где с - новая строка из второго потока.. ну и так далее... Правильно я понял?

Если так, то не проще работать непосредственно с файлом, к которому привязан список? Т.е. дописываем в конец файла строку и сколько бы потоков не было, будут добавляться только новые строки, и список тоже будет обновляться.
 
  • Спасибо
Реакции: kodzero

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8
Так а что должно быть? Скорее всего у вас просто неправильно настроена логика шаблона. Нужен проект, чтобы понять что он должен делать и что там не так.
Сейчас к сожалению возможности скинуть проект нет, так как на даче до конца выходных. После выходных скину, как буду за компом с проектом.
 

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8
Я так понял во время выполнения проекта, в список с n строк добавляется строка k и список пишется в файл (привязан к файлу)
в одном потоке запись в файл идет n+k, в 2-х потоках получается n+k+n+c, где с - новая строка из второго потока.. ну и так далее... Правильно я понял?

Если так, то не проще работать непосредственно с файлом, к которому привязан список? Т.е. дописываем в конец файла строку и сколько бы потоков не было, будут добавляться только новые строки, и список тоже будет обновляться.
Да примерно так. Правда а каждом новом действии строка не добовляется, а удаляется, где список привзан к файлу.
А как работать непосредственно с файлом минуя список, подскажите пожалуйста, не знаю такой способ.

P.S. Ступил. Буду дом посмотрю экшен работы с файлом по внимательнее, есть ли там взять строку из файла. Так как сейчас далеко, то сейчас не могу глянуть.

Всем спасибо за помощь, наверно это и есть решение ;-)
 

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 450
Благодарностей
1 880
Баллы
113
Вы не с файлом работайте, а со списком. Привязали файл к списку и берите строки. Так каждый поток будет работать с одним файлом без лишних сохранений туда чего либо.
 
  • Спасибо
Реакции: kodzero

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
При работе в многопотоке с одним и тем же файлом настоятельно рекомендую использовать операции со списком, а не операции с файлом.
 
  • Спасибо
Реакции: kodzero

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8
Извеняюсь, приехал домой, внимательнее пересмотрел шаблон и нашел ошибку в шаблоне, почему множился файл. Она никакого отнешения не имела к неправильной работе списка и закрепленного за ним файла.
Действительно правильное решение для коректной работы многопоточности, является список с закрепленным к нему файлом.
09.jpeg
Всем спасибо за внимание.
 

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8
Нужна общая переменная инкремент в многопоточном режиме.
Предположим нужно пройти телнетом по всем портам от 11000 до 12000.
Соответственно идем 11000+1 и т.д. Нужно чтобы эту плюс единицу видел каждый поток, ну и не повторял одно и тоже действие.
Я правильно понимаю, что данный вопрос решает глобальная переменная?
Просто с обычной переменной точно не работает. В каждом потоке в отдельности прибавляется по единице, ну и каждый поток в отдельности проходит по одному и тому же порту.
 

СТЕПАН

Moderator
Регистрация
17.03.2013
Сообщения
951
Благодарностей
352
Баллы
63
Соответственно идем 11000+1 и т.д. Нужно чтобы эту плюс единицу видел каждый поток, ну и не повторял одно и тоже действие
как тебе такой вариант: чтобы значения зенка брал построчно с тхт файла с удалением тогда в многопоточном режиме ни какого сбоя не будет
 
  • Спасибо
Реакции: kodzero

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 450
Благодарностей
1 880
Баллы
113
как тебе такой вариант: чтобы значения зенка брал построчно с тхт файла с удалением тогда в многопоточном режиме ни какого сбоя не будет
Это самый лучший вариант, т.к. с глобальными переменными не всё так просто. С ними очень часто что-то происходит, чего не должно было быть...то они не запускаются, то увеличиваются непонятно как...
 
  • Спасибо
Реакции: kodzero

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8
как тебе такой вариант: чтобы значения зенка брал построчно с тхт файла с удалением тогда в многопоточном режиме ни какого сбоя не будет
Такой вариант я конечно прокрутил в своей голове, но подумал, что должно быть более красивое решение, не такое энерго ресурсное, что-то типа общей переменной в проекте.

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

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 450
Благодарностей
1 880
Баллы
113
Это не будет особо грузить шаблон. Файл с тысячей строк - это совсем не много. Операции по взятию строки будут происходить незаметно. Главное не делайте лишних циклов. Завершайте шаблон там, где у него логическое окончание. Не наворачивайте лишнего и всё выполнится без проблем.
 
  • Спасибо
Реакции: kodzero

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8
Это не будет особо грузить шаблон. Файл с тысячей строк - это совсем не много. Операции по взятию строки будут происходить незаметно. Главное не делайте лишних циклов. Завершайте шаблон там, где у него логическое окончание. Не наворачивайте лишнего и всё выполнится без проблем.
Окс, спс. ;-) Перенес все свои многопоточные шаблоны на диск структуры SSD, думаю это значительно ускорит прирост производительности.
Хотелось бы еще услышать от саппорта, есть ли какое-то правильное использование общих переменных для многопоточного режима в одном шаблоне. Может если сразу за действием ++ с глобальной переменно значение присваевается обычной переменной, ну и работа потом идет с этой обычной переменной? Возможно тогда не будет накладок и путаницы по одним и тем же значениям в разных потоках?
 

PainShaft

Client
Регистрация
28.08.2013
Сообщения
38
Благодарностей
6
Баллы
8
Это самый лучший вариант, т.к. с глобальными переменными не всё так просто. С ними очень часто что-то происходит, чего не должно было быть...то они не запускаются, то увеличиваются непонятно как...
Оххх, это конечно вообще через задницу, такие решения с занесением в тхт файл, лучше на скорости проиграть, чем такие ужасы творить, уж слишком криво :-) А вообще странно что уже 5 версия программы, а с многопоточностью до сих пор нету нормального и грамотного решения, кроме как удаления строки, но это как мы видим во многих случаях не решает вопрос.
Нужна общая переменная инкремент в многопоточном режиме.
Предположим нужно пройти телнетом по всем портам от 11000 до 12000.
Соответственно идем 11000+1 и т.д. Нужно чтобы эту плюс единицу видел каждый поток, ну и не повторял одно и тоже действие.
Я правильно понимаю, что данный вопрос решает глобальная переменная?
Просто с обычной переменной точно не работает. В каждом потоке в отдельности прибавляется по единице, ну и каждый поток в отдельности проходит по одному и тому же порту.
Я так и решил проблему, с глобальной переменной , все работает стабильно , без нареканий, как по мне это куда лучше чем через тхт файл.
 
  • Спасибо
Реакции: kodzero

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
Багов и тасок по глобальным переменным сейчас нет.
Если это не так, плиз дайте линк где сообщалось об обратном. Если пропустил.
 
  • Спасибо
Реакции: kodzero

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8

kodzero

Client
Регистрация
13.02.2013
Сообщения
91
Благодарностей
7
Баллы
8
Глобальные переменные работают отлично, по крайне менее у меня в моих проектах. Спс.
Вопрос другой. Сейчас снова на даче и не могу проверить, поэтому спрашиваю сюда, чтобы было время поразмыслить.
Можно ли в сам ЗеноПостер, который запускает проекты, там где задается количество потоков прописать вместо цифры локальную или глобальную переменную, ну в таком же виде, как это делается в ПроджектМейкер? Просто мне нужно количество потоков равное количеству строк в одном из файлов.
 

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