python - asyncore 回调启动线程...可以吗?

标签 python multithreading couchdb asyncore

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

我最熟悉线程并在我所有的应用程序中使用它们。一个特定的应用程序使用 couchdb数据库作为其接口(interface)。这涉及对数据库进行长轮询以查找更改和更新。我用于 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 对象。我认为这可能是浪费。那么,在线程之间全局使用单个数据库对象是否可以?

最佳答案

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

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

关于python - asyncore 回调启动线程...可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4704285/

相关文章:

python - 将自己的参数传递给 ryu 代理应用程序

c# - 通过无限的while循环防止高CPU使用率的正确方法(控制台/窗体混合)

linux - 在 Perl 中从线程更新标签

permissions - CouchDB:没有中间件的单页 Web 应用程序帐户

ubuntu - 在 Ubuntu 16 上运行 CouchDB 的 emfile 错误

django - 什么是Django最好的CouchDB后端?

python - 无法在 Ubuntu 上安装 ZeroRPC

Python 2.6 TreeMap/SortedDictionary?

python - 结合 Adob​​e AIR 和 Python 的方法 - Python

multithreading - 使用多核解决迷宫?