【发布时间】:2015-07-12 05:52:51
【问题描述】:
我有一个接受客户端请求的 Django Web 服务器。另外,我还有另一台服务器,用Twisted写的。我写了一个 Twisted 协议——它的“一半”服务器在服务器上运行,我也有一个非常易于使用的客户端协议。
Django 服务器偶尔会收到需要向 Twisted 服务器发起请求的请求。这显然可能是一个很长的操作,所以它不能是同步的。我无法在 Django 项目中加入 Twisted 客户端来发出这些请求。
稍微简化一下架构,它看起来像这样:
最初,我在我的 Django 项目的 views.py 文件中创建了一个全局线程实例,它运行 Twisted 的反应器循环,每当通过 Django 服务器接收到请求时,我都会将它异步添加到反应器中以执行由那个线程。这适用于 python manage.py runserver 脚本,但是当我在我的 Apache 服务器上运行它时,有时会在 Twisted 服务器上收到请求,有时不会。
我假设这是因为 Apache 还运行多个线程,每个线程都尝试创建该反应器线程。由于每个进程可能只有一个反应器,因此只有一个线程成功而其他线程失败,因此只有一些请求通过 - “获胜”线程中的请求(这只是一个理论,我还没有验证它)。
我相信我的选择是:
- 以某种方式在所有 Apache 线程之间共享我的反应器线程实例,这样实际上只有一个反应器。不知道具体怎么做 - 我在网上找到的所有内容都是关于共享数据(通过 Django 的数据库),而不是共享实例。
- 在 Django 服务器机器上将 Twisted 客户端作为一个单独的进程运行,并使用一些 RPC 方法从 Django 发送请求(这不是基于 Twisted - 否则我会回到在 Django 中运行 Twisted 客户端的第一方) ,我似乎无法做到……)。
关于什么是正确的解决方案/如何实施它有什么建议吗?还有其他我没有想到的方法吗?
谢谢。
【问题讨论】:
-
我面临同样的问题。 Crotchet 是否适合您,或者您找到了其他解决方案?
标签: python django asynchronous webserver twisted