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

我最熟悉线程,并在我的所有应用中使用它们。一个特定的应用程序使用 couchdb 数据库作为其接口。这涉及长胶DB寻找更改和更新。我用于couchdb的模块是 Couchdbkit. 。它使用异步循环观察这些更改并将其发送到回调。

因此,我从这个回调中弄清楚了我启动工作人员线程的地方。混合异步和螺纹编程似乎有点粗糙。我真的很喜欢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 Gurus的其他问题。使用数据库可能会有数百个线程。正如您在我的代码示例中看到的那样,我正在实例化每个线程的couchdbkit.database对象。我认为这可能很浪费。那么,单个数据库对象可以在线程中全球使用吗?

有帮助吗?

解决方案

每当服务器返回新文档时,这不是会创建一个新线程吗?我想您最好创建一个工人线程 您可以在服务器上调用任何内容,只需将作业添加到队列中,这些线程正在从 dispatch 方法。

但是,没有理由将混合螺纹和异步编程被视为危险。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top