asyncore回调启动线程......好吗?

时间:2011-01-16 07:26:17

标签: python multithreading couchdb asyncore

我不熟悉asyncore,对异步编程的知识非常有限,除了一些扭曲教程的介绍。

我最熟悉线程并在我的所有应用中使用它们。一个特定的应用程序使用couchdb数据库作为其接口。这涉及对数据库进行longpolling以寻找更改和更新。我用于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 个答案:

答案 0 :(得分:3)

每次服务器返回新文档时,这不会创建新线程吗?我猜你最好在之前创建一个工作线程池,你可以在服务器上调用任何东西,只需将一个作业添加到队列中,这些线程正在{{1}中读取它们的工作。方法。

但是没有理由认为混合线程和异步编程应该被认为是危险的。