异步回调启动线程…可以吗?
-
11-10-2019 - |
题
我不熟悉 异步, ,并且对异步编程的了解非常有限,除了一些扭曲教程的介绍。
我最熟悉线程,并在我的所有应用中使用它们。一个特定的应用程序使用 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
方法。
但是,没有理由将混合螺纹和异步编程被视为危险。
不隶属于 StackOverflow