|
C# MultiThreading
|
|||
---|---|---|---|
#18+
Добрый день! Есть задача запускать в консольном приложении функцию параллельными потоками с предельным уровнем параллелизма, допустим 20. То есть, чтобы одновременно не более 20 потоков. Как сделал я: Код: 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.
Оно всё работает, но адски грузится проц. Даже на двух потоках четырехядерный процессор под плешку. Есть подозрение, что это из-за моего топорного способа синхронизации и ожидания потоков. И есть сильное подозрение, что это можно сделать проще. Читал про Task[], но не понял как в нем сделать ограничение одновременного числа потоков. Направьте на путь истинный или киньте примером хотя бы. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 00:40 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
Parallel.For не пойдёт? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 07:17 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
Oblom, В пуле потоков ставите 20 и task.run(. Но там вроде 20 уже и так стоит))))) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 07:38 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
OblomЧитал про Task[],а вы запустите. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 07:39 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
Petro123Oblom, В пуле потоков ставите 20 и task.run(. А как, в этом и вопрос? )) Можно просто свойство указать, дальше буду с гуглом общаться )) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 17:57 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
Pu4koffParallel.For не пойдёт? Не нашел как ограничить число одновременных потоков, там просто начальное и конечные значения плюс делегат на выполняемую функцию, других параметров нет. А мне надо, чтобы делегат выполнился от 1 до 100 раз, но при этом одновременно не более чем в N параллельных потоков ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 18:02 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
Oblom, Ну там примерно около 20. Вам ровно ровно надо? Я и не заморачивался. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 18:03 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
Petro123Oblom, Ну там примерно около 20. Вам ровно ровно надо? Я и не заморачивался. Да, хочу регулировать количество от внешних условий ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 18:14 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
где то в этом разделе кидал пример шадулера, с помощью которого можно задать количество одновременно выполняющихся потоков и закидать его тасками. как вариант, не самый элегантный, но боевой и рабочий :) пример этот есть и на сайте MS ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 18:36 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
Oblom, Ок. Я не перфекционист. Там менеджер потоков очень крутой. Учитывает кучу условий и не даст машине тормозить. Я грузил 100 задач и около 20 было всегда максимум. Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 18:39 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
Roman Mejtesгде то в этом разделе кидал пример шадулера, с помощью которого можно задать количество одновременно выполняющихся потоков и закидать его тасками. как вариант, не самый элегантный, но боевой и рабочий :) пример этот есть и на сайте MS У вас слишком много тем, боюсь не найду ))) Попробую найти на MS ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 18:45 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
вот тема Парралельный обход коллекции в строгом порядке с заданным числом потоков а вот ссылка https://msdn.microsoft.com/ru-ru/library/ee789351(v=vs.100).aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 19:00 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
OblomPu4koffParallel.For не пойдёт? Не нашел как ограничить число одновременных потоков, там просто начальное и конечные значения плюс делегат на выполняемую функцию, других параметров нет. А мне надо, чтобы делегат выполнился от 1 до 100 раз, но при этом одновременно не более чем в N параллельных потоков там есть несколько вариантов перегрузки метода В том числе можно задать ParallelOptions, а там есть MaxDegreeOfParallelism. Это правда больше про таски, а не потоки, но потоки побочно тоже ограничиваются. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 19:05 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
Как вариант - ThreadPool.SetMaxThreads ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 19:06 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
LRКак вариант - ThreadPool.SetMaxThreads Это который по умолчанию? Тогда всё. Какой ещё код нужен? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 19:14 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
Petro123LRКак вариант - ThreadPool.SetMaxThreads Это который по умолчанию? Тогда всё. Какой ещё код нужен? Насколько я понял Tasks[] и ThreadPool даже из разных фреймворков ))) И вроде как Tasks[] прогрессивнее, чем ThreadPool ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 19:28 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
Pu4koffOblomпропущено... Не нашел как ограничить число одновременных потоков, там просто начальное и конечные значения плюс делегат на выполняемую функцию, других параметров нет. А мне надо, чтобы делегат выполнился от 1 до 100 раз, но при этом одновременно не более чем в N параллельных потоков там есть несколько вариантов перегрузки метода В том числе можно задать ParallelOptions, а там есть MaxDegreeOfParallelism. Это правда больше про таски, а не потоки, но потоки побочно тоже ограничиваются. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
А вот это похоже то, что нужно. Спасибо, буду пробовать прикручивать! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 19:29 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
OblomPetro123пропущено... Это который по умолчанию? Тогда всё. Какой ещё код нужен? Насколько я понял Tasks[] и ThreadPool даже из разных фреймворков ))) И вроде как Tasks[] прогрессивнее, чем ThreadPool Забавное понимание))) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 19:34 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
LROblomпропущено... Насколько я понял Tasks[] и ThreadPool даже из разных фреймворков ))) И вроде как Tasks[] прогрессивнее, чем ThreadPool Забавное понимание))) Ну Tasks[] появились вроде как с 4-го и стали развитием ThreadPool, но могу и ошибаться, я не большой специалист не то что в многопоточности, а и в самом C# )) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 19:38 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
OblomPetro123пропущено... Это который по умолчанию? Тогда всё. Какой ещё код нужен? Насколько я понял Tasks[] и ThreadPool даже из разных фреймворков ))) И вроде как Tasks[] прогрессивнее, чем ThreadPool Task и Thread - разные вещи. В общем случае при создании Thread создаётся нативный поток операционки. Это долго, дорого и не увлекательно. Потому придумали пул потоков ThreadPool. И даже так это вышло долго, дорого и не увлекательно, поэтому еще придумали таски. Что-то похожее на менеджер потоков из ОС замутили свой, но для тасков. Соответственно работа с тасками дешевле обходится, чем с потоками. В итоге несколько параллельных тасков могут выполняться в одном потоке, а могут в разных. Соответственно при запуске 10 параллельных тасков можно сказать, что там работает не более 10 потоков, но может быть он и один по факту. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 19:40 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
OblomНу Tasks[] появились вроде как с 4-го и стали развитием ThreadPool, но могу и ошибаться, я не большой специалист не то что в многопоточности, а и в самом C# )) Заментно, что не (большой) специалист, если хотите стать - читайте документацию/разбирайтесь, если нет - тогда, конечно, проще что-то "прикрутить"... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 19:42 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
Oblom, Главное кода в строчках побольше и пулом Поуправлять по внешним факторам. Ну, мороз там, или слякоть. Работайте! Успехов. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 20:04 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
Petro123Oblom, Главное кода в строчках побольше и пулом Поуправлять по внешним факторам. Ну, мороз там, или слякоть. Работайте! Успехов. Ну или разное количество доступных прокси-серверов, для каждого из которых свой поток. Спасибо и вам удач! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 20:19 |
|
C# MultiThreading
|
|||
---|---|---|---|
#18+
Task это просто задача, которая либо возвращает результаты либо нет. Никакого отношения к многопоточности, сам по себе Task не имеет, он имеет отношение к асинхронности. Но если таски выполнять в пуле потоков, то конечно они будут "многопоточными". уже 1000 раз тут эта тема поднималась многопоточность и асинхронность совершенно разные вещи. можно сделать синхронное выполнение в 2 потоках для 2 задач, а можно сделать асинхронное выполнение 2 задач в 1 потоке. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 22:46 |
|
|
start [/forum/topic.php?fid=20&fpage=34&tid=1399518]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 303ms |
total: | 436ms |
0 / 0 |