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