|
Отловить ошибки при многопоточном выполнении
|
|||
---|---|---|---|
#18+
Всем привет, у меня есть обработчик, для которого нужно выполнить следующую функциональность. 1) Получить список ID-документов через http-запрос 2) Для каждого ID документа сделать http-запрос и распарсить его. 3) Получить распарсенные данные из всех документов. Я реализую многопоточную обработку посредством использования System.Threading.Channels. Код: c# 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. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115.
Для вышеуказаного сниппета я получаю нежелательные side-эффекты, которые отсутствуют если я запускаю парсинг в режиме одной задачи Код: c# 1. 2. 3.
В методе ParseDocByIsAsync я делаю http-запрос, в результате которого возвращается JSON- документ, у которого в обязательном порядке есть свойство "total"- проверял много раз через Postman. В результате выполнения кода я попадаю в секцию "Exception" с текстом ошибки об отсутствии свойства/токена "total" у Json-документа. Я проверяю url, по которому запрашивается Json- он приходит корректный. Проверяю значение переменной "root" при возникновении ошибки- действительно именно это свойство отсутствует. Как будто один поток прочитал свойство, закорраптил его, положил в пул для дальнейшего выполнения, другой поток подхватил таску и у же не может его нормально прочитать. Ошибка носит вероятностный характер и её вероятность возрастает с увеличением количества Task для обработки парсинга. При 5 тасках на парсинг вероятность ошибки около 90%, хотя бывало и успешное выполнение. Также заметил, что один документ может обрабатываться несколькими потоками- возможно это просто перекладывание таски из одного в другой, но использование Channels обещает потокобезопасное получение элементов из канала и то что элемент не может быть получен срузу несколькими потоками. Хоть бери и на BlockCollection откатывайся. Подскажите, кто с такой ситуацией сталкивался. Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2021, 16:06 |
|
Отловить ошибки при многопоточном выполнении
|
|||
---|---|---|---|
#18+
vb_sub, Зачем вы нам это показываете? Вы эксгибионист? Зачем тут таски, при долгоиграющих операциях, в контексте их умопомрачительных колличествах? У вас есть процедура загрузки, напишите ее тест и тестируйте, не разбираясь, глядя на хрустальный шар ... - чуйкой чувствую не реентерабельность(загадочно так) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2021, 23:35 |
|
Отловить ошибки при многопоточном выполнении
|
|||
---|---|---|---|
#18+
Для чего так люто смешивать async/await и ContinueWith. Для чего заворачивать вызовы асинхронных методов в асинхронные длегаты, а потом еще и вызывать их через Task.Run. Это не код, а говнокод. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 01:16 |
|
Отловить ошибки при многопоточном выполнении
|
|||
---|---|---|---|
#18+
Где-то в степи, создаю таски, чтобы каждый json-документ парсился в отдельной задаче - они друг от друга не зависят, поэтому хочу сделать их выполнение параллельным. Рентабельность здесь очень-высока-выполнение множества независимых задач, если запускаешь в отдельных тасках, то время выполнения уменьшается кратно. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 06:56 |
|
Отловить ошибки при многопоточном выполнении
|
|||
---|---|---|---|
#18+
fkthat, continueWith нужно для того, чтобы по завершению Task или группы Task закрыть канал и уведомить слушателей, что больше элементов не будет. Если это 1 Task, то канал можно закрыть прямо из метода, если же это группа Task, то необходимо дожидаться пока все задачи не завершатся. Заворачивать в асинхронные делегаты приходится потому что внутри методов(ParseDocByIsAsync), для которых они вызываются есть await, соответственно я не могу сделать метод просто Task- приходится делать async Task. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 06:59 |
|
Отловить ошибки при многопоточном выполнении
|
|||
---|---|---|---|
#18+
vb_sub, ну если Вы не охотно создаете свои потоки. воспользуйтесь WebClient там множество изощренных рализаций, и есть неблокирующие выполнения, с возможностью отмены, событийная модель. ваш код бы сократился до 10 строк, без вычурных каналов. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 11:21 |
|
Отловить ошибки при многопоточном выполнении
|
|||
---|---|---|---|
#18+
vb_sub, Лютая забористая дичь :) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2021, 22:57 |
|
Отловить ошибки при многопоточном выполнении
|
|||
---|---|---|---|
#18+
hVostt, какой вариант не дичь? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 07:51 |
|
Отловить ошибки при многопоточном выполнении
|
|||
---|---|---|---|
#18+
vb_sub, все придумали до нас, программировать не надо, просто копипаст и вперде. код набранный копипастом Код: c# 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 10:01 |
|
Отловить ошибки при многопоточном выполнении
|
|||
---|---|---|---|
#18+
Где-то в степи код набранный копипастом Оно и видно. Код из начала двухтысячных. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 10:53 |
|
Отловить ошибки при многопоточном выполнении
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 22:39 |
|
Отловить ошибки при многопоточном выполнении
|
|||
---|---|---|---|
#18+
fkthat Где-то в степи код набранный копипастом Оно и видно. Код из начала двухтысячных. и что с ним не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2021, 18:47 |
|
Отловить ошибки при многопоточном выполнении
|
|||
---|---|---|---|
#18+
hVostt, я вообще с нее балдею, так удобно и просто делать многопоточные комбайны, просто сказка. для интеграции, трансформации данные, просто сказка. на днях в 1 проекте внедрил, надо было 100500 файлов обработать, трансформировать данные и объединить в файлах порциями. Лучше не придумаешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2021, 21:58 |
|
|
start [/forum/topic.php?fid=20&msg=40064058&tid=1398313]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 281ms |
total: | 428ms |
0 / 0 |