我正在开发一个 django 应用程序,我正在使用cherrypy 作为服务器。Cherrypy 为每个页面视图创建一个新线程。我希望能够从它们中的任何一个中访问所有这些线程(负责与 django 对话的线程)。更具体地说,我希望能够从其中任何一个线程中访问每个线程的 thread_data。这可能吗?如果是这样,我该怎么做?
2 回答
CherryPy 的 wsgiserver 不会为每个请求创建一个新线程——它使用一个池。这些工作线程中的每一个都是 threading.Thread 的子类,因此它们都应该可以通过 threading.enumerate() 访问。
但是,如果您专门讨论的是cherrypy.thread_data,那就是另一回事了:threading.local。如果您使用的是最新版本的 Python,那么所有这些都是用 C 编码的,而您(可能是正确的)没有从 Python 对它的跨线程访问。如果你真的需要它并且真的知道你在做什么,最好的技术通常是在将这些东西插入到 thread_data 结构中的同时,在全局容器中附加对这些东西的引用。我推荐带有weakrefs的dicts作为这些全局容器的键——有足够多的Python ORM将它们用于连接池(例如,参见我自己的Geniusql),你应该能够相当容易地学习如何实现它们。
我对这样一个问题的第一反应不是告诉你如何去做,而是强调你真的应该在继续之前重新考虑。我通常会避开线程化的 Web 服务器,而倾向于多进程或异步解决方案。在混合中添加显式的线程间通信只会增加这些恐惧。
当提出这样的问题时,就有了更深层次的目标。我怀疑您认为线程间通信可以解决的问题实际上可以通过其他更安全的方式解决。