|
|
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
Программа парсит поступающие данные. Поставщик данных – TIdUDPServer с ThreadedEvent=true. Синхронизация через TIdNotify (вдруг это важно). Обработка данных в однопоточном режиме выглядит так (выброшено всё не относящееся к сути проблемы): Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. На тестах обрабатывает ~15 000 входных данных в секунду, задействовано одно ядро, всё, в общем, хорошо. Но, естественно, не масштабируется. Многопоточный вариант: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Процедура вызова потока: Код: pascal 1. 2. 3. 4. Поток: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Создание: Код: pascal 1. 2. 3. 4. 5. 6. Выполнение (ждем Event, выполняем и опять ждем): Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. При инициализации программы создается пул потоков: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Вроде всё хорошо, потоки работают, но...(см. приложенное изображение) Incoming=100000 Processed+Dropped=99852+76=99928 Куда-то пропадают сообщения. Независимо от скорости входных данных. Где я ошибаюсь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 17:49 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
flight-opГде я ошибаюсь? В выборе UDP протокола. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 18:05 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
Мимо. Однопоточный режим: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 18:13 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
Значит отлаживайся. Это и есть работа программиста. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 18:17 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
flight-opFReady:boolean; Такое использование переменной для синхронизации является потенциальной ошибкой. Гипотетически возможна такая ситуация: Поток 1 вызывает CoreData[CoreIndex].CoreTH.Start.SetEvent; Поток 2 выходит из ожидания FStartEvent.WaitFor(INFINITE), и готовится выполнить FReady:=false; Планировщик переключает обратно на поток 1 Выполняется код ProcessSyslogMessage и снова находится этот же самый CoreData c FReady=True, поскольку FReady:=false еще не был выполнен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 18:19 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
Спасибо, Дмитрий! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 18:19 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
Aniskinflight-opFReady:boolean; Такое использование переменной для синхронизации является потенциальной ошибкой. Гипотетически возможна такая ситуация: Поток 1 вызывает CoreData[CoreIndex].CoreTH.Start.SetEvent; Поток 2 выходит из ожидания FStartEvent.WaitFor(INFINITE), и готовится выполнить FReady:=false; Планировщик переключает обратно на поток 1 Выполняется код ProcessSyslogMessage и снова находится этот же самый CoreData c FReady=True, поскольку FReady:=false еще не был выполнен. (*Пытаюсь это представить*) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 18:26 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
Можно оставить переменную, но сделать FReady:=false перед CoreData[CoreIndex].CoreTH.Start.SetEvent; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 18:26 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
AniskinМожно оставить переменную, но сделать FReady:=false перед CoreData[CoreIndex].CoreTH.Start.SetEvent; Спасибо, попробую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 18:30 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
С меня причитатеся :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 18:40 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
5% пропущенных, я бы так не радовался ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 18:49 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
Дегтярев Евгений5% пропущенных, я бы так не радовался Да, и непонятно мне, по какой причине. Однопоточный вариант ест данных в 15 раз больше без дропов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 18:54 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
flight-opДа, и непонятно мне, по какой причине.Ты же сам добровольно делаешь дроп, если свободного потока нет. Не нужны дропы - жди, когда освободится какой нибудь поток и работай с ним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 18:57 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
Aniskinflight-opДа, и непонятно мне, по какой причине.Ты же сам добровольно делаешь дроп, если свободного потока нет. Не нужны дропы - жди, когда освободится какой нибудь поток и работай с ним. Понимаешь, какая заковыка, предыдущая картинка - обработка 1000 сообщений в секунду. А во эта - 10 000 сообщений в секунду. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Что-то не так с определением свободного потока, но вот что... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 19:05 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
flight-opЧто-то не так с определением свободного потокаС определением свободного потока все так. Просто его нет в момент запроса, это достаточно стандартная ситуация. Я вижу два варианта. 1) Простой вариант. Замени FReady: boolean на FReady: TEvent. В ProcessSyslogMessage вызывай WaitForMultipleObjects. 2) Вариант посложнее. В ProcessSyslogMessage ложи/клади сообщения во внутреннюю очередь, и пусть потоки сами читают из этой очереди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 19:17 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
Aniskinflight-opЧто-то не так с определением свободного потокаС определением свободного потока все так. Просто его нет в момент запроса, это достаточно стандартная ситуация. Я вижу два варианта. 1) Простой вариант. Замени FReady: boolean на FReady: TEvent. В ProcessSyslogMessage вызывай WaitForMultipleObjects. 2) Вариант посложнее. В ProcessSyslogMessage ложи/клади сообщения во внутреннюю очередь, и пусть потоки сами читают из этой очереди. Попробую. Спасибо за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 19:29 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
Почесав в затылке, придумал 3-й способ - обработал дропы в главном потоке :) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2018, 20:01 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
flight-opНа тестах обрабатывает ~15 000 входных данных в секунду, задействовано одно ядро, всё, в общем, хорошо. Но, естественно, не масштабируется.15к это очень плохо, вообще ни о чём для примитивного парсинга хотя бы на два порядка надо больше сколько выходит скорость если не парсить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2018, 00:10 |
|
||
|
Проблема с потоками
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)15к это очень плохо, вообще ни о чём для примитивного парсинга хотя бы на два порядка надо больше сколько выходит скорость если не парсить? Извини, вопрос лишен смысла. Софт для парсинга не парсить не может :)) 15к - это потрошение _скриптом_ на одном ядре E3-1220 (вопросы хранения всей этой беды оставим за кадром). Скрин глянь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2018, 00:44 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39730812&tid=2040143]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
141ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 456ms |

| 0 / 0 |
