2011-01-16 8 views
9

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?

Odpowiedz

3

Czy nie utworzyłoby to nowego wątku za każdym razem, gdy serwer zwróci nowy dokument? Domyślam się, że najlepiej utworzyć pulę wątków roboczych przed wywołasz cokolwiek na serwerze i po prostu dodajesz zadanie do kolejki, z której te wątki czytają swoją pracę z metody dispatch.

Ale nie ma powodu, dla którego mieszanie gwintowania i programowania asynchronicznego powinno być uważane za niebezpieczne.

+0

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

Powiązane problemy