<p>我一直在研究另一种梳理django和twisted的方法。可以试试看:<a href="https://github.com/kowalski/featdjango" rel="nofollow">https://github.com/kowalski/featdjango</a>。在</p>
<p>它的工作方式和其他的略有不同。它启动一个twisted应用程序和http站点。对django的请求在一个特殊的线程池中处理。它的特殊之处在于,这些线程可以等待延迟,这使得将同步django应用程序代码与异步twisted代码相结合变得很容易。在</p>
<p>我提出这样的结构的原因是,我的应用程序需要从django视图内部执行大量http请求。而不是一个接一个地执行它们,我可以一次将它们委托给运行twisted并等待它们的“主应用程序线程”。与您的问题相似的是,我还有一个异步组件,它是一个singleton,我从django视图访问它。在</p>
<p>例如,这就是如何启动twisted组件,然后从视图中获取引用。在</p>
<pre><code>import threading
from django.conf import settings
_initiate_lock = threading.Lock()
def get_component():
global _initiate_lock
if not hasattr(settings, 'YOUR_CLIENT')
_initiate_lock.acquire()
try:
# other thread might have did our job while we
# were waiting for the lock
if not hasattr(settings, 'YOUR_CLIENT'):
client = YourComponent(**whatever)
threading.current_thread().wait_for_deferred(
client.initiate)
settings.YOUR_CLIENT = client
finally:
_initiate_lock.release()
return settings.YOUR_CLIENT
</code></pre>
<p>上面的代码,初始化我的客户机并调用它的initiate方法。此方法是异步的,并返回一个延迟的。我做了所有必要的设置。django线程将等待它完成,然后再处理到下一行。在</p>
<p>我就是这样做的,因为我只从请求处理程序访问它。您可能希望在启动时启动组件,调用ListenTCP | SSL。而django请求处理程序只需访问客户机上的一些公共方法就可以获得关于连接的数据。这些方法甚至可以返回Deferred,在这种情况下,您应该使用.wait_for_defer()来调用它们。在</p>