asyncore回调启动线程...这样做可以吗?

9 投票
1 回答
937 浏览
提问于 2025-04-16 10:02

我对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方法里把任务放到这些线程可以读取的队列中。

不过,把线程和异步编程混在一起并没有什么危险的理由。

撰写回答