Cherrypy 如何处理用户线程?

Posted

技术标签:

【中文标题】Cherrypy 如何处理用户线程?【英文标题】:How does cherrypy handle user threads? 【发布时间】:2010-09-13 08:52:33 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

我对此类问题的第一反应不是告诉您如何做,而是强调您确实应该在继续进行之前重新考虑。我通常会回避线程化的 Web 服务器,转而支持多进程或异步解决方案。将显式的线程间通信添加到混合中只会增加这些恐惧。

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

【讨论】:

以上是关于Cherrypy 如何处理用户线程?的主要内容,如果未能解决你的问题,请参考以下文章

当 UI 允许新对象时如何处理取消

JAVA多线程之中断机制(如何处理中断?)

Spring框架中的Bean是线程安全的吗?如果线程不安全,要如何处理?

PHP 中如何处理并发请求(使用线程、线程池或子进程)

如何处理线程池达到服务器连接限制

完成后我应该如何处理线程?离开它还是中止它?