asyncore回调启动线程...这样做可以吗?
我对asyncore不太熟悉,对异步编程的了解也很有限,除了看过一些关于twisted的入门教程。
我最熟悉的是线程,并且在我所有的应用程序中都使用它们。有一个特定的应用程序使用couchdb数据库作为接口。这涉及到长时间轮询数据库,查看是否有变化和更新。我使用的模块是couchdbkit。它使用一个asyncore循环来监视这些变化,并将它们发送到一个回调函数。
所以,我想从这个回调函数中启动我的工作线程。把异步编程和线程编程混在一起感觉有点粗糙。我很喜欢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对象。我觉得这样可能有点浪费。那么,是否可以让一个数据库对象在多个线程之间共享使用呢?
1 个回答
3
每次服务器返回新文档的时候,这样做不会创建一个新线程吗?我觉得在你调用服务器之前,最好先创建一组工作线程,然后在dispatch
方法里把任务放到这些线程可以读取的队列中。
不过,把线程和异步编程混在一起并没有什么危险的理由。