рубиновый хеш autovivification (фасеты)

До сих пор я не нашел "хорошего" решения для этого. У меня есть некоторые более строгие требования мягкого реального времени (делающий снимок от маркируемой картонной коробки) так, вероятно, один из подходов достаточно быстр для Вас. Я предполагаю, что электронные письма могут ожидать в течение нескольких минут.

  • А "список ожидающих выполнения задач" в базе данных обрабатывается заданием крона.
  • А "список ожидающих выполнения задач" в базе данных, обработанной, постоянно будучи опрошенным демоном.
  • Используя пользовательского демона, который уведомляется веб-сервером через пакет UDP (в Производстве сегодня). В основном моя собственная система Организации очередей со стеком IP для обработки очереди.
  • Используя ActiveMQ как брокер сообщений - это не удалось из-за проблем устойчивости. Также мне Демоны Java обычно несколько пухлы
  • Используя Триггеры Обновления в CouchDB. Хороший, но Триггеры Обновления не предназначены, чтобы сделать тяжелую обработку изображений, так отрицательный результат, подходящий для моей проблемы.

До сих пор я не попробовал RabbitMQ и XMPP/ejabebrd для того, чтобы решить проблему, но они находятся в моем списке следующих вещей попробовать. RabbitMQ получил достойную возможность соединения Python в течение 2008 и существуют тонны библиотек XMPP.

, Но возможно все, в чем Вы нуждаетесь, является правильно настроенным mailserver на локальной машине. Это, вероятно, позволило бы Вам выводить письма синхронно в локальный mailserver и таким образом делать Ваш целый программный стек намного более простым.

8
задан artemave 1 October 2009 в 12:29
поделиться

2 ответа

The standard new method for Hash accepts a block. This block is called in the event of trying to access a key in the Hash which does not exist. The block is passed the Hash itself and the key that was requested (the two parameters) and should return the value that should be returned for the requested key.

You will notice that the leet lambda does 2 things. It returns a new Hash with leet itself as the block for handling defaults. This is the behaviour which allows autonew to work for Hashes of arbitrary depth. It also assigns this new Hash to hsh[key] so that next time you request the same key you will get the existing Hash rather than a new one being created.

18
ответ дан 5 December 2019 в 06:38
поделиться

Также стоит отметить, что этот код можно сделать однострочным следующим образом:

def self.autonew(*args)
  new(*args){|hsh, key| hsh[key] = Hash.new(&hsh.default_proc) }
end

Вызов Hash # default_proc возвращает процедуру, которая использовалась для создания родителя, поэтому мы здесь есть хорошая рекурсивная установка.

Я рассказываю о подобном случае в моем блоге.

8
ответ дан 5 December 2019 в 06:38
поделиться
Другие вопросы по тегам:

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