Как правильно работать с многопоточностью

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93


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

При запуске в многопоточном режиме(сколько делать = 500), макс. что видел это 6 работающих потоков.
Искал по форуму, но ответ не нашел.

Понятно что основной затык, это запись в файл.
Забивается очередь к винту, но я так понял из того что написано на форуме, что запись в файл идет
не сразу, а с какой то периодичностью.





Вроде сделано все правильно, в списках нажат чекбокс "сохранять в файл".




Проверка и добавление в список идет через блокировку.


В общем непонятно, почему поднимается так мало потоков.
 

Вложения

qzen4i

Client
Регистрация
01.05.2014
Сообщения
1 408
Благодарностей
314
Баллы
83


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

При запуске в многопоточном режиме(сколько делать = 500), макс. что видел это 6 работающих потоков.
Искал по форуму, но ответ не нашел.

Понятно что основной затык, это запись в файл.
Забивается очередь к винту, но я так понял из того что написано на форуме, что запись в файл идет
не сразу, а с какой то периодичностью.





Вроде сделано все правильно, в списках нажат чекбокс "сохранять в файл".




Проверка и добавление в список идет через блокировку.


В общем непонятно, почему поднимается так мало потоков.
Как я понял, он не успевает открыть все потоки пока открывается один закрывается второй, можешь так попробовать.
Если конечно я правильно понял, о чём был речь.

Ну а там сделать счётчик какой то, хотя по потокам то что он открывает 6 потоков, он просто не успевает открыть все потоки так как работает быстро, и 20-30 потоков не успевает просто на просто, что то типо того)
 

Вложения

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Как я понял, он не успевает открыть все потоки пока открывается один закрывается второй, можешь так попробовать.
И чего с этим делать?
У меня примерно сейчас так и сделано, только не через зацикливание в шабе.

Просто беру выставляю кол-во повторений = кол-во строк в списке.
На прогон и выполнение работы уходит примерно мин. 30.

Где то читал что это зависит от железа - скорость создания новых потоков.
Но не думаю что у меня в этом трабла. Проц FX8350, оперативы 24 гига.

Сейчас обновился lite -> pro и решил переделать под многопоточность, в расчете что будет уходить времени скажем мин. 2-3.
И чтобы на рабочем шабе не экперементировать, решил сначала потестить, как оно вообще работается с многопотоком.
И тут такой облом - поднимается мало потоков.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
вы чего мудрите, смотри свои настройки зенопостера, покрайней мере у меня в 50 потоков за 5 секунд отработало, потоки поднимаются последовательно, поэтому если ты ждёшь параллельной обработки за пол секунды то этого не будет, плюс ты лочишь список

и в проекте отключи браузер
P.S. И странная какая то логика, брать строку сравнивать с пустым списком, потом опять брать строку и сравнивать опять с этим же списком, на выходе получаем удаление дублей, зачем такая логика и к чему ???
 
Последнее редактирование:
  • Спасибо
Реакции: Moadip

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
смотри свои настройки зенопостера, покрайней мере у меня в 50 потоков за 5 секунд отработало
Это который тестовый проект я прикрепил к начальному посту?
Если так, то просьба сделать скрин своих настроек.

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

А лочится для того, чтобы разные потоки не начали работать с одной и той же строкой.
В списке откуда берутся строки есть дубли.

Соответственно если два разных потока возьмут одинаковые одинаковые строки, скажем "строка1".
То в списке, куда складываются, этой строки нет, и они одновременно сделают проверку на есть ли в списке, то туда два раза и запишется "строка1".

Или как то по другому делается, чтобы не было коллизий между потоками?

и в проекте отключи браузер
Ок, попробую.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
во первых откуда у тебя берётся ничего не лочится, но тоесть в стандартном кубике лок стоит, ты берёшь с одного списка и сравниваешь с пустым сначала, потом в него добавляешь строку, снова берёшь строку со списка и сравниваешь эти же строки, ты с одним списком работаешь, хорошо на логику посмотри, когда берёшь строку с удалением лочить необязательно
P.S. Ты просто напросто перекладываешь с одного списка в другой без дублей, это одинаково тому что ты просто сделаешь удаление дублей
 
  • Спасибо
Реакции: Moadip

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Напишу что за хрень я делаю.:-)

Есть список с email, с которых отправляются мессаги.
Берется email, заходится в почту.
Проверяется наличие новой почты.
Дальше идет прогон по новым письмам.

Первое что делается, это берется адресат и смотрится есть ли его мыло в другом списке, ну типа писалось уже или нет.
Если нет, то это мыло добавляется в список и адресату пишется ответ.
Если есть, то берется следующее письмо.

И т.д.

Так вот проблема в том, что на разные email с которых делаю рассылку могут приходить письма от одних и тех же адресатов.

Когда это делается в один поток - проблем нет, все отрабатывается по очереди.
При многопотоке, может получиться так, что разные потоки при обработке входящих могут наткнутся на одного и того же адресата.
И проверив, что его нет в списке "кому уже писалось", отправят каждый по письму. Что не есть гуд.

Поэтому прежде чем применять все это дело на рабочем шаблоне, хотел протестить многопоточность.

Что мне надо было для себя уяснить:

1. Каждый поток берет новую строку из списка email от которых будут слаться мессаги.
Ну с этим вроде бы ок. На форуме где то читал, что если прикреплять список к файлу, через "сохранять изменения в файл", то гарантируется потокобезопасность.

2. Проверка наличия адресата/запись в список должна быть потокобезопасной, чтобы не было дублей и прочей хрени.
Это я так понял делается через блокировку с использованием объекта синхронизации SyncObjects.ListSyncer, сделанного спец. для списков.
Если это делается как то по другому - просьба написать КАК.

3. Производительность, сколько потоков поднимается, во сколько уменьшается кол-во времени для отработки.

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

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
я ведь выше написал, потому что последовательно, сами потоки у меня тоже не все 50 сразу стартанули, вот если ты параллельно сделаешь тогда все 50000 потоков залетят в список, у тебя стоит лок, список привязанный, пока поток не сделает своё дело другой не суётся, и получается что всё происходит мгновено в твоём коде поэтому 6 потоков успевают обработать, они все 5000 например обработались, но в твоей логике они завершаются и поэтому ты видишь 5 или 6 или сколько там ещё. Я так думаю
 
  • Спасибо
Реакции: Moadip

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Я понимаю что при блокировке идет работа в один поток.
И хрен бы с ним сколько я там вижу потоков в работе, но дело в том, сколько на это уходит времени.
Да, можно было бы сказать, что из за того что шаб отрабатывает быстро, то и потоков видно столько мало, но там стоит задержка от 1 до 7 секунд.

Это дохрена.

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

У меня же получается в пике 5 потоков, ну допустим даже если бы каждую сек. было 5 новых потоков, но даже это не так.

Получается 1 сек/5 потоков = 200мс.

200 мс. уходит на сравнение и запись в оперативке?o_O

Это ж бред.

И почему 5-6 потоков а не скажем 15-16.

Карочь записал видос.
http://screencast.com/t/cpUbCKGruk

Имхо, считаю что медленно идет работа.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Вот такой скорости я примерно и ожидал.:-)
Осталось понять в чем трабла у меня, что надо настроить.

Вот настройки вкладки инстанс.

Что надо настроить?
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
это для работы с браузером настройки, что надо это только выставить потоки и всё, ну попробуй память до конца сделать и время выгрузки списка и таблиц вначало

И ещё, у тебя максимум 40 а ты выставляешь 500, ты хоть милиард выстави больше 40 не будет
 
  • Спасибо
Реакции: Moadip

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
это для работы с браузером настройки, что надо это только выставить потоки и всё, ну попробуй память до конца сделать и время выгрузки списка и таблиц вначало
Не помогло.(

Попробовал еще во вкладке Потоки выставить значение Кол-во потоков в одном процессе = 10, ничего не изменилось.

И ещё, у тебя максимум 40 а ты выставляешь 500, ты хоть милиард выстави больше 40 не будет
Да это понятно...
Но у меня даже близко к 40 нет.
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
В общем вопрос частично решен.
Через тимвивер пообщался с ssXXXss.

Помог решить траблу.
За что ему респект и уважуха.:ay:

Проблема в том, что в настройках проекта надо отключать браузер


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

rostonix

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

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
От 1 до с 7 сек.

Попробовал поставить 10 сек. Также примерно 5 потоков.
Если ставить задержку скажем сек 30, то уже поднимается где то 12 потоков.

В общем получается что на создание одного инстанса уходит от 2 сек.

Вот мне и не понятно, почему когда браузер отключен, там кол-во потоков зашкаливает.
А когда включен, всего пару штук.

Неужели создание окна браузера отжирает столько ресурсов/времени?

В настройках инстанса "Максимальное кол-во памяти" поставил на максимум, плюс "Держать баз в резерве" ставил штук 30.
Подумал ну раз так медленно создаются, так пусть будут типа в резерве.
Результата ноль, как было штук 5-6 потоков, так и осталось.
 

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