Предназначены ли TAP и async / await для выделенных потоков? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть некоторое количество потоков, выделенных для одной задачи (запросы на получение и обработку), и некоторое количество потоков, выделенных для других задач (задачи, выполняющиеся длительно / интенсивно работающие с ЦП). Это консольное приложение.

И я хочу использовать async / await во всех потоках, но я узнал, что async / await использует управляемый пул потоков для запуска продолжения, что означает, что обработка запросов может быть отложено из-за того, что показывается куча задач с интенсивным использованием процессора (да, так много, поэтому у меня ограниченное количество потоков для выполнения этой работы)?

  1. Если я хочу ограничить параллелизм, тогда я должен не использовать TAP?
  2. Если я хочу выполнить некоторую работу в фоновом режиме для времени жизни приложения, то я также не должен использовать TAP?
  3. Должен ли я написать реализацию ThradPool с собственным SyncronizationContext для этого ?
  4. Есть ли другой способ запустить продолжение в некотором наборе потоков?

1 Ответ

2 голосов
/ 13 апреля 2020

И я хочу использовать async / await во всех потоках, но я узнал, что async / await использует управляемый пул потоков для запуска продолжения, что означает, что обработка запросов может быть отложена из-за показа множества задач, интенсивно использующих процессор вверх (да, так много, поэтому у меня ограниченное количество потоков для этой работы)?

Это достаточно подробный анализ. Технически, это не async / await, который нуждается в пуле потоков для продолжения, но внутренние реализации метода TAP. Тем не менее, это общий шаблон в BCL, и из-за этого исчерпание пула потоков может вызвать задержки для асинхронного завершения.

Если я хочу ограничить параллелизм, то я не должен использовать TAP ?

Пока вы не перегружаете пул потоков, вы можете использовать TAP. Ограничение параллелизма освободило бы пул потоков, который включит TAP.

Если я хочу выполнить некоторую работу в фоновом режиме для времени жизни приложения, то я также не должен использовать TAP?

Я бы подумал об этом как о "не утопите пул потоков в работе". Исчерпанный пул потоков не подходит для любых видов работ.

Должен ли я написать реализацию ThradPool со своим собственным SyncronizationContext для этого? Есть ли другой способ запустить продолжение в некотором наборе потоков?

Вы можете использовать SynchronizationContext, чтобы контролировать, где await возобновляет выполнение, но все еще есть внутренние BCL-завершения, которые нужно поставить в очередь в пул потоков. Там нет контроля над этим; единственный реальный вариант - оставить пул потоков свободным.

...