асинхронные обратные вызовы запуска потоков ... нормально делать? - PullRequest
9 голосов
/ 16 января 2011

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

1 Ответ

3 голосов
/ 16 января 2011

Не приведет ли это к созданию нового потока каждый раз, когда сервер возвращает новый документ?Я предполагаю, что вам лучше всего создать пул рабочих потоков до , когда вы вызываете что-либо на сервере, и просто добавляете задание в очередь, из которой эти потоки читают свою работу, в методе dispatch.

Но нет никаких причин, по которым смешивание потоков и асинхронного программирования следует считать опасным.

...