Jestem niezaznajomiony z asyncore i mam bardzo ograniczoną znajomość programowania asynchronicznego, z wyjątkiem kilku wstępów do wykręconych samouczków.wywołania zwrotne asyncore uruchamiające wątki ... ok zrobić?
Jestem zaznajomiony z wątkami i używam ich we wszystkich moich aplikacjach. Jedna konkretna aplikacja korzysta z bazy danych couchdb jako interfejsu. Wymaga to długiego dopełniania bazy danych w poszukiwaniu zmian i aktualizacji. Moduł, którego używam dla couchdb to couchdbkit. Używa pętli asyncore do obejrzenia tych zmian i wysłania ich do wywołania zwrotnego.
Tak więc, z tego wywołania zwrotnego wynika, że uruchamiam wątki robocze. Wydaje się nieco prymitywne mieszanie programowania asynchronicznego i gwintowego. Naprawdę lubię couchdbkit, ale wolałbym nie wprowadzać problemów do mojego programu.
Moje pytanie brzmi, czy bezpieczne jest uruchamianie wątków z asynchronicznego wywołania zwrotnego?
Oto niektóre kodu ...
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.
Aktualizacja:
Po patrząc na to bardziej, mam dodatkowe pytanie dla guru couchdbkit. Za pomocą bazy danych potencjalnie będą setki wątków. Jak widać w przykładowym kodzie, tworzę instancję obiektu couchdbkit.Database dla każdego wątku. Myślę, że to może być marnotrawstwo. Czy jest możliwe, aby pojedynczy obiekt bazy danych był używany globalnie wśród wątków?
Tak, to jest tworzenie nowego wątku na zamówienie. Każdy pracownik otworzy tunel i wykona różne zadania konserwacyjne na urządzeniu zdalnym. Nie rozważałem puli wątków, ale być może biorąc pod uwagę, w jaki sposób wykorzystywane są wywołania zwrotne, może to być dobry pomysł. Dzięki za wejście. – sbartell