Xav*_*újo 10 python django node.js webrtc django-channels
我正在开发一个需要特定信令服务器实现的WebRTC应用程序.最初我在NodeJS中开发服务器但后来我决定迁移到Python(使用Django Channels AsyncWebsocketConsumer通过Websockets与客户端通信).迁移后,我使用WebSocket基准测试工具Thor来比较两种实现,这些是获得的结果(5000个websocket连接,每个连接发送1000条消息):
Python(Django Channels)实现:
class SignallingConsumer(AsyncWebsocketConsumer):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.peer = None
self.signal = None
self.is_peer_registered = False
async def connect(self):
await self.accept()
async def disconnect(self, close_code):
pass
async def receive(self, text_data=None, bytes_data=None):
pass
Run Code Online (Sandbox Code Playgroud)
NodeJS实现:
method.start = function () {
this.webServer = this.createWebServer();
this.webServer.listen(this.config.port, function (){
console.log("Web server is listening");
});
this.socket = this.createWebSocket(this.webServer);
this.socket.on('connection', function(ws) {
var pingsCompleted = 0;
ws.on('message', function(evt) {
}.bind(this));
// Set out ping/pong mechanism
var pingInterval = setInterval(function() {
if(pingsCompleted > 2) {
ws.close();
}
else {
ws.ping();
pingsCompleted++;
}
}.bind(this), config.pingPeriod);
ws.on('pong', function(evt) {
pingsCompleted = 0;
}.bind(this));
ws.on('close', function(evt) {
}.bind(this));
Run Code Online (Sandbox Code Playgroud)
Python(Django频道)结果:
Online 30792 milliseconds
Time taken 30792 milliseconds
Connected 3714
Disconnected 0
Failed 1286
Total transferred 4.43MB
Total received 525.91kB
Durations (ms):
min mean stddev median max
Handshaking 4795 11410 5517 10824 23923
Latency NaN NaN NaN NaN NaN
Run Code Online (Sandbox Code Playgroud)
NodeJS结果:
Online 41307 milliseconds
Time taken 41307 milliseconds
Connected 4051
Disconnected 0
Failed 949
Total transferred 952.72kB
Total received 693.4kB
Durations (ms):
min mean stddev median max
Handshaking 2 1124 1044 860 5200
Latency NaN NaN NaN NaN NaN
Run Code Online (Sandbox Code Playgroud)
因此,在两种实现中,失败连接的数量或多或少相同,Django Channels中握手协商的持续时间比NodeJS慢得多,这让我重新考虑了Python的迁移.
这些结果也正常吗?在这种情况下使用NodeJS会更好吗?
NodeJS 在相当低的级别上执行非阻塞 I/O,并由 V8 支持,V8 进行了相当好的 JIT 优化。
Django 通道是一个更高级别的构造,性能也很大程度上取决于 Python 实现。CPython 等直接解释字节码并使用全局执行锁。
我希望 NodeJS 在 CPython 上的表现比 Django 更好。但是,如果您出于其他原因更喜欢 Django,您可能需要比较 PyPy、IronPython 和 Jython 的性能。