|
|
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Делаю парсинг страниц. Для каждой страницы запускаю новый поток: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Запускаю 50 потоков в цикле (например), иначе сайт банит. Итерации соответствуют номерам страниц. Но количество страниц на сайте может быть больше 50, могу определить это количество. Нужен совет, как запускать цикл по 50 потоков до тех пор, пока не исчерпаются количества страниц. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2017, 09:23:39 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
applauserЗдравствуйте. Делаю парсинг страниц. Для каждой страницы запускаю новый поток: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Запускаю 50 потоков в цикле (например), иначе сайт банит. Итерации соответствуют номерам страниц. Но количество страниц на сайте может быть больше 50, могу определить это количество. Нужен совет, как запускать цикл по 50 потоков до тех пор, пока не исчерпаются количества страниц. Спасибо. Например создать семафор на 50 и перед запуском нового потока подождать его. Каждый поток, начинаясь, блокирует семафор, а завершаясь - освобождает. Дел на 10 минут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2017, 10:18:53 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
schi, Накидал на скорую руку. Всё ли верно? Просто под рукой Delphi нет. Код: 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. 25. 26. 27. 28. 29. 30. 31. 32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2017, 11:16:57 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
Ну вы гоните что ли В новых версиях есть Parallel.For ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2017, 12:23:39 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUНу вы гоните что ли В новых версиях есть Parallel.For и что ? Тредами всё, уже нельзя пользоваться ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2017, 12:24:48 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
defecator, Нельзя ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2017, 12:44:40 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
defecator, На самом деле дело не в тредах. А в коде, который можно подсмотреть там. Если я ничего не путаю, в стандартной реализации используется AtomicIncrement, а никакой не семафор. И тем более не for i ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2017, 12:47:29 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
applauserschi, Накидал на скорую руку. Всё ли верно? Просто под рукой Delphi нет. Код: pascal 1. 2. Мне кажется что нет, зачем вам дохреналиард семафоров? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2017, 12:55:18 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
alekcvp, Прошу прощения, семафор должен создаваться вне цикла, разумеется: Код: 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. 25. 26. 27. 28. 29. 30. 31. 32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2017, 13:09:25 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
Создал список страниц, создал пул потоков и по факту передачи ссылки потоку на страницу удаляешь её из списка. Делов-то... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2017, 13:27:43 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUdefecator, На самом деле дело не в тредах. А в коде, который можно подсмотреть там. Если я ничего не путаю, в стандартной реализации используется AtomicIncrement, а никакой не семафор. И тем более не for i Я использую библиотеку MtxVec, там реализован параллельный for и много чего ещё, и гораздо круче, чем в Parallel. В Паралель я не могу запустить сотни четыре потоков, приложение выходит из-под контроля, а в MtxVec он ещё и по ядрам сам раскладывает нагрузку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2017, 13:53:05 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
applauserschi, Накидал на скорую руку. Всё ли верно? Просто под рукой Delphi нет. Код: 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. 25. 26. 27. 28. 29. 30. 31. 32. Нет, ждать семафора следует ПЕРЕД созданием потока, а не внутри него. Ну и вынести создание семафора за цикл, уже написали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2017, 14:19:00 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
applauser, Смысла в этих потоках не будет никакого все равно, раз "процедура" через synchronize вызывается. В лучшем случае будет просто медленнее, чем если в главном потоке по очереди в цикле по одной странице обрабатывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2017, 15:14:37 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
defecatorЯ использую библиотеку MtxVec, там реализован параллельный for и много чего ещё, и гораздо круче, чем в Parallel. и что ещё, например, - исходники есть? В Паралель я не могу запустить сотни четыре потоков зачем ?! приложение выходит из-под контроля синей изолентой примотай а в MtxVec он ещё и по ядрам сам раскладывает нагрузку. а гипертрейдинговую пару как одно ядро считает или как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2017, 17:53:42 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
wadmanСоздал список страниц, создал пул потоков и по факту передачи ссылки потоку на страницу удаляешь её из списка. Делов-то...у человека проблема как 120 на 50 поровну разделить авторНужен совет, как запускать цикл по 50 потоков до тех пор, пока не исчерпаются количества страниц.а тут списки, пулл ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2017, 17:58:02 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
applauser, используйте ZeroMQ, эта задача как раз для него: 16591809 Никаких мьютексов и семафором (и, следовательно, никаких дедлоков), только сообщения. Вот твоя задачка, решенная в рамках нитей, не процессов. Но с ZMQ ты легко ее можешь масштабировать, вместо нитей создавая процессы, в том числе и на других компьютерах сети: достаточно лишь изменить протокол с inproc на tcp и изменить строку коннекта. В zmq уже встроены очереди и алгоритмы распределения заданий (сообщений) свободным клиентам. Весь код Код: 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. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. Сперва создаем столько нитей-парсеров, сколько нужно. Минимум из максимально допустимого числа нитей и общего числа страниц. Почему не раздаем задания сразу? Потому, что в реальных системах коннект может выполняться не мгновенно, а очередь существует как на приеме, так и на передаче (длина очереди регулируется). Как только появится готовая к работе нить, все задания могу быть отправлены ей, так как другие нити еще не запустились и не приконнектились к серверу. Поэтому сперва запускаем все парсеры, они сообщают о готовности и начинаю ждать получение задания: Код: pascal 1. 2. 3. 4. 5. 6. Вот сам парсер: Код: 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. 25. 26. 27. 28. 29. 30. ... Ну вот, можно напихать заданий в очередь. По мере готовности парсеров задание будет извлекаться из очереди и отправляться свободному парсеру. Если очередь переполнится, программа тормознет на этом месте до момента освобождения ресурса: Код: pascal 1. 2. 3. 4. 5. 6. Парсеры шлют результат работы, которые накапливаются в приемной очереди. Мы знаем, что результатов должно быть столько же, сколько и страниц. Дожидаемся этих результатов: Код: pascal 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2017, 21:42:20 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
чччД...с ZMQ ты легко ее можешь масштабировать, вместо нитей создавая процессы, в том числе и на других компьютерах сети: достаточно лишь изменить протокол с inproc на tcp и изменить строку коннекта... Более того, так как Код: pascal 1. - данный парсер всегда отсылает результат именно отправителю задания. Таким образом, задания на обработку ("парсинг") могут поступать откуда угодно, из разных нитей, процессов и компьютеров-узлов сети. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2017, 21:52:00 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
Bred eFeMdefecatorЯ использую библиотеку MtxVec, там реализован параллельный for и много чего ещё, и гораздо круче, чем в Parallel. и что ещё, например, - исходники есть? В Паралель я не могу запустить сотни четыре потоков зачем ?! приложение выходит из-под контроля синей изолентой примотай а в MtxVec он ещё и по ядрам сам раскладывает нагрузку. а гипертрейдинговую пару как одно ядро считает или как? наверное, ты сам себе сейчас показался самым умным ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2017, 00:14:39 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
А действительно, зачем 400 потоков. У тебя 200 ядерный сервер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2017, 00:18:10 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
rgreatА действительно, зачем 400 потоков. У тебя 200 ядерный сервер? тут я уже создавал тему насчёт создания тысяч элементарных потоков ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2017, 00:23:39 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
Понятней не стало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2017, 00:36:53 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
rgreatА действительно, зачем 400 потоков. У тебя 200 ядерный сервер?потому что при скачивании страниц из веба нагрузка на проц ~ 0, узкое место не в вычислительных мощностях ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2017, 00:58:49 |
|
||
|
Многопоточный парсинг
|
|||
|---|---|---|---|
|
#18+
Хм, а разве для 400-т парралельных HTTP запросов разве обязательно надо 400 потоков? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2017, 02:00:25 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39480979&tid=2042074]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
348ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 619ms |

| 0 / 0 |
