То, когда потоки создаются для агента Scala, реагирует?

int num = 12346;
int sum = 0;
for (int n = num; n > 0; sum += n % 10, n /= 10) ;
8
задан Ryan 30 December 2013 в 22:05
поделиться

3 ответа

Это правда, что для чисто событийного актора его код реакции выполняется в том же потоке, что и код отправки сообщения.

Но в Scala, поскольку нежелательно блокировать поток когда актор вызывает блокирующую операцию внутри своего кода реакции и объединяет акторов, основанных на событиях и потоках (имея возможность их составлять), оба типа акторов используют один и тот же пул потоков, но акторы, основанные на потоках, получают свои собственные потоки, тогда как акторы на основе событий совместно используют потоки на основе очереди задач. Подробнее см. Актеры, объединяющие темы и события Филиппа Халлера и Мартина Одерски

9
ответ дан 5 December 2019 в 07:59
поделиться

Не предполагайте отдельную нить для каждого Актера. Механизм Scala создает пул рабочих потоков и увеличивает этот пул только в том случае, если размер «заблокированных» субъектов больше, чем размер пула. Когда ваш актер вызывает receive , он находится в заблокированном состоянии, пока не получит свое сообщение.

5
ответ дан 5 December 2019 в 07:59
поделиться

Библиотека планировщика использует пул потоков для управления выполнением акторов. Я не знаю особенностей используемой в нем логики, но мне кажется естественным ожидать, что он:

  • Инициализируется более чем с одним потоком в пуле, поскольку многопоточные приложения, скорее всего, будут использовать больше, чем one thead.

  • Выберите поток, который будет использоваться с ожидающим субъектом в порядке очереди - потоки освобождаются до конца очереди и захватываются с начала очереди.

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

3
ответ дан 5 December 2019 в 07:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: