Cherrypy如何处理用户线程?

时间:2020-03-06 14:46:03  来源:igfitidea点击:

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

解决方案

我对这样的问题的第一反应不是告诉我们如何做,而是强调在进行此操作之前,我们确实应该重新考虑。我通常会避开线程化的Web服务器,转而使用多进程或者异步解决方案。将显式线程间通信添加到混合中只会增加那些担心。

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

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

但是,如果我们专门谈论的是cherrypy.thread_data,那就另当别论了:threading.local。如果我们使用的是Python的最新版本,那么所有这些都是用C语言编写的,并且我们(可能是正确的)没有从Python对其进行跨线程访问。如果我们确实需要它并且真的知道自己在做什么,那么最好的技术通常是在将它们插入thread_data结构的同时,在全局容器中添加对此类内容的添加引用。我建议使用带有弱引用的字典作为这些全局容器的键-有足够的Python ORM将它们用于连接池(例如,请参阅我自己的Geniusql),我们应该能够轻松地学习如何实现它们。