Будет ли применяться кэширование переменных, если я создаю экземпляр класса от другого работника? - PullRequest
0 голосов
/ 24 января 2020

У меня есть 2 работника, и оба работника вызывают фабрику, которая инициализирует экземпляр класса, и в методе initialize я использовал кэширование переменных, чтобы оба работника могли воспользоваться преимуществами кэширования переменных при создании экземпляра класса .

class BoxFolderDocumentSynchronizerJob < ActiveJob::Base
  queue_as :default

  def perform(document_store_id, folder_id)
    synchronizer = DocumentSynchronizerFactory.get_synchronizer(document_store, folder_id)
  end
end

class DeleteBoxFolderDocumentJob < ActiveJob::Base
  queue_as :default

  def perform(document_store_id, folder_id=nil)
    synchronizer = DocumentSynchronizerFactory.get_synchronizer(document_store, folder_id)
  end
end

module DocumentSynchronizers
  class Base
    attr_reader :document_store, :facility

    def initialize(document_store, folder_id=nil)
      if document_store
        @folder_id = folder_id
        @document_store  = document_store
        @facility = document_store.facility
        #Fetch all the document store(project) documents from S3/Box service provider
        @service_provider_documents_hash ||= DocumentStoreAdapterHandler.new(@document_store).list(folder_id)
        @vueops_documents_hashmap ||= @document_store.documents.inject({}){|hash, document| hash[document.file_id] = document; hash}
      else
        raise "Document store instance should not be nil"
      end
    end
  end
end

Мой вопрос - когда заканчивается область кэширования переменной?

1 Ответ

2 голосов
/ 24 января 2020

Два последовательных вызова метода могут, в зависимости от вашей настройки, завершиться выполнением в

  • одного и того же процесса в том же потоке (запоминание работает)
  • одного и того же процесса в другом потоке (запоминание работает)
  • разные процессы (запоминание не работает)
  • даже на другом компьютере / виртуальной машине (запоминание не работает)

Если работники используют тот же экземпляр DocumentSynchronizer, тогда кеширование будет работать, иначе нет.

В вашем случае (расширение комментария @Stefan) запоминание не приносит никакой пользы, потому что оно используется внутри метода initialize. Этот метод выполняется только один раз и . Ничего не выполняется до , которые могут установить значение. Так что нет никакой разницы в @variable = xxx.

. Заметка имеет больше смысла, если вы используете ее следующим образом:

class Something
  def value
    @value ||= some_expensive_calculation_that_can_be_cached
  end
end

и затем не используете @value напрямую, а используете метод value. Это дает дополнительное преимущество, заключающееся в отсрочке расчета до фактического его использования (если оно используется не всегда)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...