|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
Задача такая: В некий класс/сервис должны поступать задачи. В рамках задачи нужно работать с базой в рамках транзакции + вызовы к сторонним системам через HttpClient, в случае успеха выполнения которых нужно успешно закрывать транзакцию. При этом стоит требование об ограничении количества параллельно выполняющихся таких задач (тасков). Соответственно по задумке, при поступлении задачи должен стартовать новый Task и что-то там делать. Общее количество работающих задач я планирую ограничить через семафор. Но сложность в том, чтобы реализовать следующее: Нужно проконтролировать, что задачи при успешном И не успешном выполнении отчистят все ресурсы за собой: закроют соединение, освободят семафор, уберут ссылку на себя - чтобы не утекала память. На все время выполнения задачи ссылку на нее нужно где-то сохранять, чтобы сборщик мусора не убил, но затем эту ссылку нужно почистить. Как такое можно реализовать ? Есть ли готовые решения ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 13:08 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
Используйте TaskScheduler ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 13:10 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
точнее реализуйте свой. который будет запускать таск, с ограничением на количество, очередью выполнения и прочим, прочим, прочим ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 13:11 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
Roman Mejtesточнее реализуйте свой. который будет запускать таск, с ограничением на количество, очередью выполнения и прочим, прочим, прочим Про TaskScheduler не знал, спасибо, буду копать. А вот необходимость реализовывать "ограничением на количество, очередью выполнения и прочим, прочим, прочим" как раз смущает ) Этого я и хотел избежать. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 13:13 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCoreЭтого я и хотел избежать тогда программиста нанимать нужно ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 14:16 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
Изопропил, Ищем, приходите на собеседование ) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 14:19 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
Насчет TaskScheduler я переборщил. Из головы вылетело про него. Обычно напрямую таски создаем через Task.Run. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 14:20 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCoreбазой в рамках транзакции + вызовы к сторонним системам через HttpClient,читать про РАСПРЕДЕЛЕННЫЕ транзакции. Дорогая штука. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 14:43 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCore, Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 14:52 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCoreЭтого я и хотел избежать.дык у вас в ТЗ слова Ограничения/ограничить.))) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 14:55 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCore, в сторону pipeline- pattern смотрел? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 15:06 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
Petro123WaspNewCoreбазой в рамках транзакции + вызовы к сторонним системам через HttpClient,читать про РАСПРЕДЕЛЕННЫЕ транзакции. Дорогая штука. Распределенные задачи не нужны ! Требуется чтобы созданный таск в рамках транзакции обрабатывал данные из бд. Запрашивал дополнительную информацию у стороннего сервиса, и успешно закрывал транзакцию после обработки. Либо падал с откатом транзакции, чтобы кто-то другой подхватил задачу и попробовал ее сделать. Основная сложность, при поступлении задач, генерить таски не больше заданного одновременного количества (думаю через семафор), а также следить за тем, чтобы таски завершаясь освобождали ресурсы - тот же семафор. Соотвественно где-то хранить список текущих тасков, защищая их от сборщика мусора, и удалять завершенные. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 15:08 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
vb_subWaspNewCore, в сторону pipeline- pattern смотрел? В первый раз слышу про него, это явно не классический от GOF. Почитаю, может придумаю как задействовать. Надеюсь это не просто producer-consumer..... Ой. Кстати. Может BlockingCollection поможет решить мою задачу, нужно подумать.. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 15:11 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCoreРаспределенные задачи не нужны ! Требуется чтобы созданный таск в рамках транзакции обрабатывал данные из бд. Запрашивал дополнительную информацию у стороннего сервиса, и успешно закрывал транзакциюможет в школу сходить? Распределенные не задачи, я говорил, а транзакции. Приводи пример уже что ли. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 15:23 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCore, Если без распределенных, то обычная очередь для того чтобы другой подхватил. Транзакция будет одна в одном блоке try. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 15:26 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCoreТребуется чтобы созданный таск в рамках транзакции обрабатывал данные из бд.все бд работают в рамках транзакции. Комментируй. Либо это лишние слова и ты просто читаешь из бд, и потом пишешь несколько операций одной транзакцией. Например 10 раз insert с откатом. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 15:29 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCoreОбщее количество работающих задач я планирую ограничить через семафор.вместо пула потоков с maxPoolingThread? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 15:32 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
Petro123, Есть тонкость, которую я забыл упомянуть. Одновременно будет работать несколько таких сервисов, по обработке задач. Работать будут в одном приложении - в разных потоках. Поэтому ограничить через общий пул потоков не выйдет. Нужны индивидуальные настройки. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 15:42 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCoreЕсть ли готовые решения ? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Что по ТЗ упустил? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 15:45 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCoreнесколько таких сервисовпереведи. Зачем? У тебя и от одного сервиса весь проц будет занят. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 15:47 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCoreобщий пул потоковон общий вроде на процесс ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 15:48 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCore, Задача равно поток. И не усложняй жизнь семафорами. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 15:50 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCore, зачем ограничивать общее количество работающих задач? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 15:56 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
vb_subWaspNewCore, зачем ограничивать общее количество работающих задач?+1 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 16:00 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
Petro123, Упущено ограничение на одновременную работу не более заданного числа. Т.е. должно быть примерно так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 16:55 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
Petro123WaspNewCoreобщий пул потоковон общий вроде на процесс Вот именно. Он общий на весь процесс. Поэтому если нам нужно, чтобы Service1 мог породить только 3 одновременно работающих таска, а Service2 - 5, то и начнется проблема. Которую я и думаю как решать. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 16:57 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
vb_subWaspNewCore, зачем ограничивать общее количество работающих задач? Да просто, чтобы не завалить сторонний сервис, к которому обращение идет через HttpClient, потоком запросов. Ну и вообще, нужна возможность конфигурировать нагрузку. Например, чтобы уменьшить нагрузку на базу. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 16:58 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCoreДа просто, чтобы не завалить сторонний сервис,смешно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 17:02 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCoreНапример, чтобы уменьшить нагрузку на базу.еще смешнее. maxPoolThread =2 и будет 2 запроса на всю базу. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 17:04 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCoreесли нам нужно, чтобы Service1 мог породить только 3 одновременно работающих таска, а Service2 - 5, тозачем 2 сервиса? Ты сам себе придумал задачу. Типо есть один цикл for выбирающий очередь. Тебе захотелось два цикла for вызывающих один метод Run() ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 17:07 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
Petro123, Какие 2 ? Насколько я помню формула "количество процессов*2". С учетом гипертрединга 4х ядерный процесс даст 16 потоков. Вот эти 16 потоков нужно распределить между несколькими классами-сервисами. Этому 3, другому 5. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 17:38 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
Petro123WaspNewCoreесли нам нужно, чтобы Service1 мог породить только 3 одновременно работающих таска, а Service2 - 5, тозачем 2 сервиса? Ты сам себе придумал задачу. Типо есть один цикл for выбирающий очередь. Тебе захотелось два цикла for вызывающих один метод Run() Каждый сервис обрабатывает данные по своей специфике. Это отдельные классы, в которых совершенно своя логика, и она может быть очень отличной. Вся суть задачи - это сделать такой обработчик задач. Его будем расширять классами обработчиками. Их там уже штук 6 набирается. Но они не все одновременно будут работать. Вот я и думаю как это все реализовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 17:41 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCorePetro123, Какие 2 ? Насколько я помню формула "количество процессов*2". С учетом гипертрединга 4х ядерный процесс даст 16 потоков. Вот эти 16 потоков нужно распределить между несколькими классами-сервисами. Этому 3, другому 5. Количество Процессоров имелось ввиду. На сервере там может и больше вообще процессоров. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 17:42 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCorePetro123, Какие 2 ? Насколько я помню формула "количество процессов*2". С учетом гипертрединга 4х ядерный процесс даст 16 потоков. Вот эти 16 потоков нужно распределить между несколькими классами-сервисами. Этому 3, другому 5. Нет. По умолчанию у меня 10 что ли потоков. Но механизм этот зависит не просто от ядер. В него просто не нажо лезть. Зачем распределять? Распил бабла? Если доводов нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 17:49 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCoreЕго будем расширять классами обработчиками.выше я 3 метода написал. Внутри них нельзя расширить бизнес логику? Сервис это запускалка. А логика в классе MyЛогика.Run(); ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 17:52 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCoreС учетом гипертрединга 4х ядерный процесс даст 16 потоков. Вот эти 16 потоков нужно распределить между несколькими классами-сервисами. Этому 3, другому 5.ты 16-тью потоками запросами боишься веб сервис положить? Ну смешно же. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 17:55 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
Petro123, дело еще не в столько, чтобы не положить, но и в том, чтобы они между собой не конкурировали за потоки. Чтобы не стартануло 16 длительных задач, не дающих работать быстрым. Поэтому и нужно распределение пула потоков между ними. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 18:00 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
Petro123WaspNewCoreЕго будем расширять классами обработчиками.выше я 3 метода написал. Внутри них нельзя расширить бизнес логику? Сервис это запускалка. А логика в классе MyЛогика.Run(); ну вот нужно еще, чтобы они после своей работы семафор отпускали. плюс учитывать вероятность ошибок - падений. Чтобы при этом тоже семафор почистился. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 18:01 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCoreмежду собой не конкурировали за потоки.кто они? Поток изолирован или выше писал что поток это задача. Где конкуренция? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 18:02 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCoreсемафорсемафор не бывает без общего разделяемого ресурса. А его нет. Задачи параллельные. Смотри код. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 18:03 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCoreплюс учитывать вероятность ошибок - паденийtry при async работает. Попробуй) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 18:04 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
WaspNewCore, Есть анекдот, когда мужик в поезде очищал банан, потом солил, и выбрасывал в окно. На вопрос зачем? Он отвечал что не любит соленые бананы. Так и ты ввел семафор и спрашиваешь как с ним тут работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 18:07 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
авторКласс System.Threading.ThreadPool обеспечивает приложение пулом рабочих потоков, управляемых системой, позволяя пользователю сосредоточиться на выполнении задач приложения, а не на управлении потоками. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 18:15 |
|
Как реализовать такую идею ? Есть ли готовые решения ?
|
|||
---|---|---|---|
#18+
авторЧисло операций, которое можно поставить в очередь в пуле потоков, ограничено только доступной памятью. Однако пул потоков имеет ограничение на число потоков, которое можно активировать в процессе одновременно. Если все потоки в пуле заняты, дополнительные рабочие элементы помещаются в очередь и ожидают их освобождения. Начиная с .NET Framework 4, размер пула потоков по умолчанию для какого-либо процесса зависит от нескольких факторов, таких как размер виртуального адресного пространства. Процесс может вызвать метод ThreadPool.GetMaxThreads для определения количества потоков. Вы можете управлять максимальным количеством потоков с помощью методов ThreadPool.GetMaxThreads и ThreadPool.SetMaxThreads.я MS верю)) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 18:17 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1399031]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
59ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
others: | 258ms |
total: | 430ms |
0 / 0 |