Я читаю много данных из ldap, которые необходимо сравнить с соответствующими записями в базе данных. Чтобы свести к минимуму количество SQL-запросов, я хочу объединить несколько записей ldap в один запрос.Уведомление потребителя, когда производитель сделан
Все это довольно просто: поток для создания ldap-результатов и поток для использования этих результатов и запуска SQL-запроса.
ldap_results = Queue.Queue(10) def producer(): for result in ldap_results(): ldap_results.put(result) def consumer(): buffer = [] buffer_size = 5 while True: record = ldap_results.get() buffer.append(record) if len(buffer) >= buffer_size: do_sql(buffer) buffer = []
Проблема: если только возвращает LDAP, скажем, 3 результатов и buffer_size
является 5, то в конечном итоге блокирование навсегда. Я понимаю, что могу положить в буфере специальный токен, например None
, или "EOF"
, но это похоже на плохой дизайн: «итерация до тех пор, пока вы не закончите, о, если вы не увидите это особое значение, это означает, что вы тоже сделали ».
Я придумал две альтернативные идеи. Первое состоит в том, чтобы иметь общую переменную eof
, но я не знаю, как ее правильно синхронизировать.
def producer(): while data: buffer.put() eof = True def consumer(): while not eof: buffer.get()
Во-вторых, есть метод ProduceChunks(chunk_size)
для производителя, и она будет обрабатывать пакетирования до результатов, но мне не нравится, потому что это предполагает, что производитель будет знать, как лучше буфер до результатов , когда, действительно, я думаю, что это ответственность потребителя.
Есть ли у кого-нибудь указания?