|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
barrabas, Извини, свой проект есть. Готовый код альтруисты бывают, но редко. Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 16:26 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
barrabas Код: c# 1. 2. 3. 4. 5.
ИМХО Не очень хорошая идея повисать на Wait() внутри таска. Этим ты поток занимаешь из трэдпула. Лучше при старте запустить 4 таска, а внутри таска цикл: извлечь очередной необсчитанный элемент taskList[] и обсчитать. Т.е. тасков столько, сколько надо потоков. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 16:29 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
Как вариант Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 16:31 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
Petro123barrabas, В оракле JOB на своём ЯП. Делай. как на plsql и джобах сделать я знаю. но в данном конкретном случае мне нужно консольное приложение, которое будет запускаться в существующей инфраструктуре (принимать определенные уже параметры из вне, писать лог в нужном формате и т.д.), со своим шедулером, который все это обеспечивает, который умеет прибивать приложения, а останавливать джобы нет. если отдать все в БД, то убив приложение, процесс не остановится. в общем, есть готовая инфраструктура работающая и данная нам в ощущениях и выбор решения обусловлен именно этим. Я конечно ценю советы, серьёзно, но вопрос был именно про дотнет. как я уже сказал, что найденное решение может тиражироваться и на сторонние web-сервисы ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 16:32 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
Dima TЛучше при старте запустить 4 таска, а внутри таска цикл: извлечь очередной необсчитанный элемент taskList[] и обсчитать. Т.е. тасков столько, сколько надо потоков. Тоже так подумал, но возникает (небольшая) проблема на старте (см.код выше) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 16:34 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
Dima Tbarrabas Код: c# 1. 2. 3. 4. 5.
ИМХО Не очень хорошая идея повисать на Wait() внутри таска. Этим ты поток занимаешь из трэдпула. Лучше при старте запустить 4 таска, а внутри таска цикл: извлечь очередной необсчитанный элемент taskList[] и обсчитать. Т.е. тасков столько, сколько надо потоков. понятно, такой вариант описывал выше, но почему-то остановился не на нем. наверное действительно будет лучше. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 16:35 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
Petro123barrabas, Извини, свой проект есть. Готовый код альтруисты бывают, но редко. Удачи! да без проблем. спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 16:36 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
так всего 4 потока. Код: 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.
все в свою очередь запустились (return string.Format("{0} - {1} [{2}]", OrderNum, RunNum, SleepSec);) 3 - 3 [3] 2 - 2 [5] 4 - 4 [8] 1 - 1 [10] 6 - 6 [7] 5 - 5 [12] 8 - 8 [8] 7 - 7 [10] 10 - 10 [4] 11 - 11 [1] 12 - 12 [3] 9 - 9 [10] 16 - 16 [4] 13 - 13 [10] 14 - 14 [12] 15 - 15 [11] 17 - 17 [7] 18 - 18 [6] 19 - 19 [10] 20 - 20 [14] ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 16:49 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
LRDima TЛучше при старте запустить 4 таска, а внутри таска цикл: извлечь очередной необсчитанный элемент taskList[] и обсчитать. Т.е. тасков столько, сколько надо потоков. Тоже так подумал, но возникает (небольшая) проблема на старте (см.код выше) Потому что ты неправильно это написал Код: c# 1. 2. 3. 4.
надо так Код: c# 1. 2.
В этом случае не надо дожидаться кто раньше стартанет, т.к. первый запустившийся начнет выполнять первое задание. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 16:50 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
Dima TВ этом случае не надо дожидаться кто раньше стартанет, т.к. первый запустившийся начнет выполнять первое задание. Нет Дима, первый запустившийся не обязательно успеет взять первое задание, в этом то и проблема... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 16:53 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
LRDima TВ этом случае не надо дожидаться кто раньше стартанет, т.к. первый запустившийся начнет выполнять первое задание. Нет Дима, первый запустившийся не обязательно успеет взять первое задание, в этом то и проблема... Внимательно посмотри на код 20903233 Я не про первого созданного, а именно про первого запустившегося. Номер первого задания надо получать внутри таска, а не снаружи. В этом проблема твоего кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 16:56 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
Dima TВнимательно посмотри на код 20903233 Я не про первого созданного, а именно про первого запустившегося. Номер первого задания надо получать внутри таска, а не снаружи. В этом проблема твоего кода. Так как ты предлагаешь у меня было с самого начала, результат мне не понравился, т.к. я не про "первого запустившегося", а про "первого запускаемого", понимаешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 17:02 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
Объясните дураку чем не подходит Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 17:14 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
Pu4koffОбъясните дураку чем не подходит Код: c# 1.
у еее всем подходит ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 17:23 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
Pu4koffОбъясните дураку чем не подходит Код: c# 1.
+5 Вроде именно для таких. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 17:31 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
Dima T, вот как еще можно решить проблему со стартом (сигнализировать из задания, когда оно "подхватило" свой первый номер) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 17:40 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
Pu4koffОбъясните дураку чем не подходит Код: c# 1.
Нет гарантии, что будет в нужном порядке. Метод AsOrdered ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 18:46 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
LRDima T, вот как еще можно решить проблему со стартом (сигнализировать из задания, когда оно "подхватило" свой первый номер) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Зачем лишний тормоз? Не надо тут никакой синхронизации. Похоже тебя смущает что Console.WriteLine() отрабатывает не так как ты ожидаешь. Это проблема вызова Console.WriteLine() и не более того. Замени Console.WriteLine() на добавление в ConcurrentQueue<string> и в конце выведи содержимое. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 19:35 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
refreg, Дак в него нужно отдавать коллекцию на одну дату. Иначе вообще никакой параллельности. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 19:37 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
Т.с. бы ещё таймштамп ввёл и просил очерёдности выполнения)). ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 19:40 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
Dima TЗачем лишний тормоз? Не надо тут никакой синхронизации. Похоже тебя смущает что Console.WriteLine() отрабатывает не так как ты ожидаешь. Это проблема вызова Console.WriteLine() и не более того. Замени Console.WriteLine() на добавление в ConcurrentQueue<string> и в конце выведи содержимое. Да нет же)) Гипотетически "строгость" может быть необходимой и на старте по номерам заданий/потоков, т.е., чтобы задание/поток№1 обрабатывал первый элемент, №2 - второй, и т.д. Вот я и "усилил" условие задачки (больше из эстетических соображений), чтобы не было стартовой "путаницы", когда, к примеру, первый елемент хватает задание/поток№3, а №1 достается второй элемент... Впрочем, спорить что правильно а что нет не имеет смысла, т.к. мы не знаем зачем ТСу такой "строгий порядок". ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 20:08 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
какой поток из пула запустит первую дату не важно. важно чтобы моментом старта обработки у меньшей даты был меньше или равен следующей по порядку. а причина довольна простая, чтобы можно было остановить процесс обработки и точно сказать, что обработалось от сих до сих, а а не в разнобой. до этого код был написан немного не оптимально, бралось нужное кол-во дат и запускалось одновременно, дожидались код-да все завершаться, потом следующая партия. получалалось что потоки какое-то время простаивают, тк время обработки может быть разным. вот заметил и решил исправить. переписал на Parallel.Foreach(<ConcurrentQueue>, new ParallelOptions { MaxDegreeOfParallelism = 4 }, item => {}) погонял тесты, вроде все норм, хотя тут есть комент что порядок не гарантирован. по идее для получения элемента из очереди используется спецметоды, а foreach может использовать просто IEnumerable, тогда хз, гарантируется ли соблюдение очереди? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2017, 09:19 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
время обработки разное но не кардинально, т.е. первая дата не будет обрабатываться когда уже в другом потоке обрабатывается 20я. поэтому допустимо такое упрощение имеет право на .. и опять же есть готовая инфраструктура запуска приложения и управления параметрами. ну и опять же прерывать и перезапускать будет человек и читать лог тоже. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2017, 09:25 |
|
Парралельный обход коллекции в строгом порядке с заданным числом потоков
|
|||
---|---|---|---|
#18+
barrabas, Так условие очерёдности в параллельной работе ты сам выдумал? Заняться тебе нечем. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2017, 09:27 |
|
|
start [/forum/topic.php?fid=20&msg=39542663&tid=1399646]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 156ms |
0 / 0 |