Агенты Scala: получите по сравнению с, реагируют

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

110
задан Jim Ferrans 10 August 2009 в 00:28
поделиться

4 ответа

Пробелы должны быть в начале полей ТОЛЬКО там, где они являются частью данных. Excel не удаляет начальные пробелы. Вы получите нежелательные пробелы в заголовках и полях данных. Хуже того, ", который должен« защищать »этот разрыв строки в третьем столбце, будет проигнорирован, потому что он находится не в начале поля.

Если у вас есть символы, отличные от ASCII (закодированные в UTF-8) в файле у вас должна быть спецификация UTF-8 (3 байта, шестнадцатеричный EF BB BF ) в начале файла. В противном случае Excel будет интерпретировать данные в соответствии с кодировкой по умолчанию для вашего языкового стандарта (например, cp1252) вместо utf-8, и ваши символы, отличные от ASCII, будут удалены.

Следующие ниже комментарии относятся к Excel 2003, 2007 и 2013; не тестировалось в Excel 2000

Если вы открываете файл двойным щелчком по его имени в проводнике Windows, все работает нормально.

Если вы открываете его из Excel, результаты могут отличаться:

  1. У вас только ASCII символов в файле (и без спецификации): работает.
  2. В файле есть символы, отличные от ASCII (закодированные в UTF-8), со спецификацией UTF-8 в начале: он распознает, что ваши данные закодированы в UTF-8, но он игнорирует расширение csv и отправляет вас в окно Text Import not-a-Wizard , к сожалению, в результате возникает проблема с разрывом строки.

Возможные варианты: Отсутствие необходимости ни в сохранении, ни в восстановлении состояния стека ускоряет запуск потока.

Существуют различные причины производительности, по которым вам может понадобиться то или иное. Как вы знаете, слишком много потоков в Java - не лучшая идея. С другой стороны, поскольку вы должны присоединить актера к потоку, прежде чем он сможет реагировать , получить сообщение быстрее, чем отреагировать на него. Так что, если у вас есть акторы, которые получают много сообщений, но очень мало с ними работают, дополнительная задержка response может сделать его слишком медленным для ваших целей.

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

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

78
ответ дан 24 November 2019 в 03:16
поделиться

Ответ - «да» - если ваши акторы не блокируют что-либо в вашем коде, и вы используете response , тогда вы можете запустить свой «одновременно « программа в одном потоке (попробуйте установить системное свойство ctors.maxPoolSize , чтобы узнать).

Одна из наиболее очевидных причин, по которым необходимо отказаться от стека вызовов заключается в том, что в противном случае метод loop завершился бы ошибкой StackOverflowError . Как бы то ни было, фреймворк довольно ловко завершает реакцию , вызывая исключение SuspendActorException , которое перехватывается циклическим кодом, который затем снова запускает реакцию через , а затем метод.

21
ответ дан 24 November 2019 в 03:16
поделиться

Эти утверждения о «отбрасывании стека» также сбили меня с толку на некоторое время, и я думаю, что понял это сейчас, и теперь это мое понимание. В случае «приема» в сообщении происходит блокировка выделенного потока (с помощью object.wait () на мониторе), и это означает, что полный стек потоков доступен и готов к продолжению с момента «ожидания» при получении сообщение. Например, если у вас есть следующий код

  def a = 10;
  while (! done)  {
     receive {
        case msg =>  println("MESSAGE RECEIVED: " + msg)
     }
     println("after receive and printing a " + a)
  }

, поток будет ждать в вызове приема, пока сообщение не будет получено, а затем продолжит работу и напечатает сообщение «после получения и печать 10» со значением «10», которое находится в кадре стека до того, как поток заблокирован.

В случае реакции такого выделенного потока нет, все тело метода реакции захватывается как закрытие и выполняется некоторым произвольным потоком на соответствующем акторе, получающем сообщение. Это означает, что будут выполняться только те операторы, которые могут быть записаны как замыкание, и именно здесь в игру вступает возвращаемый тип «Nothing». Рассмотрим следующий код

  def a = 10;
  while (! done)  {
     react {
        case msg =>  println("MESSAGE RECEIVED: " + msg)
     }
     println("after react and printing a " + a) 
  }

. Если бы response имел тип возвращаемого значения void, это означало бы, что допустимо иметь операторы после вызова «react» (в этом примере оператор println, который печатает сообщение «после реакции и выводит 10 "), но на самом деле это никогда не будет выполнено, поскольку только тело метода" реагировать "захватывается и упорядочивается для выполнения позже (по прибытии сообщения). Так как контракт response имеет тип возвращаемого значения «Nothing», не может быть никаких операторов после реакции, и поэтому нет причин для поддержания стека.В приведенном выше примере переменную «a» не нужно поддерживать, поскольку операторы после вызовов реакции не выполняются вообще. Обратите внимание, что все необходимые переменные в теле реакции уже зафиксированы как замыкание, поэтому он может выполняться нормально.

Среда java-акторов Килим фактически обслуживает стек, сохраняя стек, который разворачивается при получении сообщения в ответ.

20
ответ дан 24 November 2019 в 03:16
поделиться

Просто чтобы было здесь:

Event-Based Programming without Inversion of Control

Эти статьи связаны с scala api для Actor и обеспечивают теоретическую основу для реализации actor. В том числе о том, почему react может никогда не вернуться.

8
ответ дан 24 November 2019 в 03:16
поделиться
Другие вопросы по тегам:

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