cherrypy如何处理用户线程?

时间:2008-09-26 05:47:58

标签: django multithreading concurrency cherrypy

我正在使用django应用程序,我正在使用cherrypy作为服务器。 Cherrypy为每个页面视图创建一个新线程。我希望能够从其中任何一个中访问所有这些线程(负责与django交谈的线程)。更具体地说,我希望能够从其中任何一个中访问每个线程的thread_data。这可能吗?如果是这样,我该怎么做?

2 个答案:

答案 0 :(得分:6)

CherryPy的wsgiserver不会为每个请求创建一个新线程 - 它使用一个池。每个工作线程都是threading.Thread的子类,因此所有这些线程都可以通过threading.enumerate()访问。

但是,如果你专门讨论cherrypy.thread_data,那就是另一个:threading.local。如果您使用的是最新版本的Python,那么用C语言编写的所有内容(您可能都是正确的)都没有Python的跨线程访问权限。如果真的需要它并且真的知道你正在做什么,那么最好的技巧通常是在全局容器中同时附加对这些东西的引用,它们被插入到thread_data结构中。我推荐带有weakrefs的dicts作为那些全局容器的键 - 有足够的Python ORM将它们用于连接池(例如,参见我自己的Geniusql),你应该能够相当容易地学习如何实现它们。

答案 1 :(得分:4)

我对这样一个问题的第一反应并不是告诉你该怎么做,而是要强调你在继续前进之前真的应该重新考虑。我通常回避线程网络服务器,支持多进程或异步解决方案。向混合添加显式的线程间通信只会增加这些恐惧。

当提出这样的问题时,有一个更深层次的目标。我怀疑你认为线程间通信会解决的问题实际上可以通过其他更安全的方式解决。