I'm unfamiliar with asyncore, and have very limited knowledge of asynchronous programming except for a few intro to twisted tutorials.
I am most familiar with threads and use them in all my apps. One particular app uses a couchdb database as its interface. This involves longpolling the db looking for changes and updates. The module I use for couchdb is couchdbkit. It uses an asyncore loop to watch for these changes and send them to a callback.
So, I figure from this callback is where I launch my worker threads. It seems a bit crude to mix asynchronous and threaded programming. I really like couchdbkit, but would rather not introduce issues into my program.
So, my question is, is it safe to fire threads from an async callback?
Here's some code...
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.
Update:
After looking over this more, I have an additional question for the couchdbkit gurus. There will potentially be hundreds of threads using the database. As you can see in my code sample, I am instantiating a couchdbkit.Database object per thread. I think this may be wasteful. So, is it ok for a single database object to be used globally among the threads?