обратные вызовы asyncore, запускающие потоки… хорошо, что делать?

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

Я больше всего знаком с потоками и использую их в все мои приложения. Одно конкретное приложение использует базу данных couchdb в качестве интерфейса. Это включает в себя долгий опрос базы данных в поисках изменений и обновлений. Модуль, который я использую для couchdb, - couchdbkit . Он использует асинхронный цикл для отслеживания этих изменений и отправки их в обратный вызов.

Итак, я полагаю, из этого обратного вызова я запускаю свои рабочие потоки. Смешение асинхронного и многопоточного программирования кажется немного грубым. Мне очень нравится couchdbkit, но я бы предпочел не вводить проблемы в свою программу.

Итак, мой вопрос: безопасно ли запускать потоки из асинхронного обратного вызова?

Вот код ...

def dispatch(change):
    global jobs, db_url # jobs is my queue
    db = Database(db_url)
    work_order = db.get(change['id']) # change is an id to the document that changed. 
                                  # i need to get the actual document (workorder)

    worker = Worker(work_order, db) # fire the thread
    jobs.append(worker)
    worker.start()
    return


main()
.
.
.

consumer.wait(cb=dispatch, since=update_seq, timeout=10000) #wait constains the asyncloop.

Обновление:

Изучив это еще, у меня есть дополнительный вопрос к гуру couchdbkit. Потенциально будут сотни потоков, использующих базу данных. Как вы можете видеть в моем примере кода, я создаю экземпляр couchdbkit. Объект базы данных на поток. Я думаю, это может быть расточительно. Итак, можно ли использовать один объект базы данных глобально среди потоков?

9
задан brandizzi 27 July 2011 в 18:40
поделиться