我一直在研究另一种结合 django 和 twisted 的方式。随意尝试一下:https ://github.com/kowalski/featdjango 。
它的工作方式与其他方式略有不同。它启动了一个扭曲的应用程序和 http 站点。对 django 的请求在一个特殊的线程池中处理。它的特别之处在于,这些线程可以在 Deferred 上等待,这使得将同步 django 应用程序代码与异步扭曲代码结合起来变得很容易。
我想出这样的结构的原因是我的应用程序需要从 django 视图中执行大量 http 请求。我可以一次将它们全部委托给扭曲运行并等待它们的“主应用程序线程”,而不是一一执行它们。与您的问题相似的是,我也有一个异步组件,它是一个单例,我从 django 视图访问它。
例如,这就是您启动扭曲组件以及稍后从视图中获取参考的方式。
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
上面的代码启动了我的客户端并调用了它的启动方法。此方法是异步的并返回一个 Deferred。我在那里做了所有必要的设置。django 线程将等待它完成,然后再处理下一行。
我就是这样做的,因为我只从请求处理程序中访问它。您可能希望在启动时启动您的组件,以调用 ListenTCP|SSL。比您的 django 请求处理程序只需访问客户端上的一些公共方法即可获取有关连接的数据。这些方法甚至可以返回 Deferred,在这种情况下,您应该使用 .wait_for_defer() 来调用它们。