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