2008-11-12 2 views
1

Я читаю много данных из 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) для производителя, и она будет обрабатывать пакетирования до результатов, но мне не нравится, потому что это предполагает, что производитель будет знать, как лучше буфер до результатов , когда, действительно, я думаю, что это ответственность потребителя.

Есть ли у кого-нибудь указания?

ответ

0

Подход «EOF» является вполне респектабельным. Давайте посмотрим на микрокосм строки ANSI. Нуль - это EOF. Что плохого в этом?

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

В любом случае это нормально.

Не имеет значения.

1

Я бы пошел по образцу «Запустить его, сделать правильно, сделать его быстрым, сделать его простым».

Можете ли вы реализовать это правильно без специального маркера «EOF»? Если нет, тогда вам просто нужно использовать токен EOF, не потейте. Да, условие завершения более сложное, но теперь оно «правильно».

Смежные вопросы