1. AI新视界首页
  2. AI经验分享
  3. 框架平台

Django科学计算平台搭建中,实时监控运行状态的解决方案

Django科学计算平台搭建中,实时监控运行状态的解决方案, 使用 Node.js 和 Socket.IO 实现 Django 的实时处理

在利用django搭建计算平台的过程中,常遇到运算过程比较复杂,运算时间比较长的问题.如何高效率计算,并且提供用户良好的信息提示,并且保证不会让浏览器假死或者TIMEOUT?

之前尝试

1.修改nginx和uwsgi的相关参数,使得浏览器不会timeout.

2.后来改用AJAX轮寻,程序运行状态

3.再后来受到实时聊天程序启发,决定寻找基于socket的解决方案.

于是本文介绍一种基于Node.js 和 Socket.IO 实现 Django 的实时处理.

本文参照:http://www.oschina.net/translate/realtime-django-using-nodejs-and-socketio

作出了自己部署上的一些改变.

组成模块和软件:

  • Django 1.4+
  • Redis 2.6.x (版本可选,但是建议使用)
  • Redis-py 2.7.x (仅当你使用Redis时需要)
  • Node.js v0.8.x
  • Socket.IO v0.9.x
  • Cookie v0.0.5
  • 数据库、sqlite、其他你觉得类似数据库形式的 均可

注意这个Socket.IO的版本,否则会有问题.

step1: 安装各个软件包:

step2:  用django开始一个项目:

step3: django基本配置

配置号数据库信息,以及模板位置,urls得信息等等.

step4: Model

models很简单,我们将要建一个包含user和text的表。如果你想让他更复杂一些,可以添加chatroom等信息。(为了简单起见,这里只写了两个)

step5: 创建数据库,生成表格

这就是我们将要使用的model,接下来执行下面的syncdb代码(第一行代码),创建数据库。然后创建几个user来测试。(第二行代码)

step6: Node Server With Socket.IO

这一部分将要介绍实时信息的发送和获取。使用Node.js创建一个依赖Socket.IO的app server,使用Redis 来做这项苦差事。在nodejs文件夹中,创建一个叫做“chat.js”的文件,然后把它放在里面:

首先,我们导入并创建http server来监听localhost 4000端口。然后订阅Redis的 “chat” chanel。最后,只要我们在Django view中调用就可以了。

上次我们设置了Socket.IO能在本地领域使用cookie的那个Django设置,这能让我们通过socket.handshake.cookie去访问cookie数据。能让我们怎样得到用户的session会话。

我们设置Socket.IO的cookies之后我们才能持有很多事件,第一个事件是Redis 发布通道,当我们的用户注意到一个新的消息已经被通知它将发送消息给所有站点的客户端。

另一个事件是当客户端通过Socket.IO发送一个信息,我们使用字符串查询(queryString)模块去创建一个query查询才能被发送到我们的Django服务。我们的Django服务在本地端口3000将会运行但你能改变端口根据情况。路径设置成/node_api那个URL,我们在应用里面创建的。一旦我们发送queryString我们等待的Django就会保存相关组件并给我们返回”Everything worked(都在工作)”。如果我们没有得到返回给我们的输出错误就关闭节点控制台.

一个关于不使用Redis的节点

你真的完全没必要为这项目使用Redis,我发现它将是一个好的学习体验,如果你想分流Redis你可以创建一个通道,使用表达式或一些其它类库,在这上面的代码会从Django里接收一个消息当一个注释被保存时,然后你能通过Socket.IO添加注释给所有的客户端

step7: 模板

在上面我们用socket.IO在本地端口4000连接我们的节点服务。当从服务器得到了一个信息我们就在目录和添加它到我们注释列表里做了些转义,当我们想要发送一个信息我们就对输入盒子里做了相应的13(按下一个键)的按键检查。一旦那被按下后我们就发出信息给服务器使其被持有。一旦它被Django保存到我们的数据库我们就得到一个”message”事件将其添加到我们的会话列表里

我们的Django显示我们在下一步将加载一个”comments”变量,因此我们那样设置并遍历下面所有的循环。这部分仅仅是当页面初始加载时使用了,我们的javascript将添加数据给这个目录作为一个新的数据来自我们的Node服务

step8: view文件

让我们看看这里发生了什么。home是一个标准的view文件。使用select_related来获得每一个comment的username,而不是在页面第一次加载的时候,就返回一个comment的query集合。

第二个就是我们Node app发送信息的view。我们从POST中获取sessionid,然后通过解码获得userid。确定user存在后,就可以创建comment了。现在吧username 和 comment 发送到 Redis server。最后,把数据发送到这里叫做”chat”的频道。

step9: urls文件

step10: 运行

注意:

1.运行这里的端口与post端口要一致,

2.localhost与127.0.0.1是不一样的在某些情况下,不一致会出错.

3. 原文的最后应该是nodejs chat.js而不是node chat.js

4. 注意npm安装位置是根据当前文件夹的.所以引用Socket.IO和cookie包的时候容易报路径错误.

5.github

以后可以根据这个例子还实时推送运行状态(r.publish)

来源:部分内容本站原创

step10: 运行

注意:

1.运行这里的端口与post端口要一致,

2.localhost与127.0.0.1是不一样的在某些情况下,不一致会出错.

3. 原文的最后应该是nodejs chat.js而不是node chat.js

4. 注意npm安装位置是根据当前文件夹的.所以引用Socket.IO和cookie包的时候容易报路径错误.

5.github

以后可以根据这个例子还实时推送运行状态(r.publish)

 

来源:部分内容本站原创

step10: 运行

注意:

1.运行这里的端口与post端口要一致,

2.localhost与127.0.0.1是不一样的在某些情况下,不一致会出错.

3. 原文的最后应该是nodejs chat.js而不是node chat.js

4. 注意npm安装位置是根据当前文件夹的.所以引用Socket.IO和cookie包的时候容易报路径错误.

5.github

以后可以根据这个例子还实时推送运行状态(r.publish)

 

来源:部分内容本站原创

step10: 运行

注意:

1.运行这里的端口与post端口要一致,

2.localhost与127.0.0.1是不一样的在某些情况下,不一致会出错.

3. 原文的最后应该是nodejs chat.js而不是node chat.js

4. 注意npm安装位置是根据当前文件夹的.所以引用Socket.IO和cookie包的时候容易报路径错误.

5.github

以后可以根据这个例子还实时推送运行状态(r.publish)

 

来源:部分内容本站原创

step10: 运行

注意:

1.运行这里的端口与post端口要一致,

2.localhost与127.0.0.1是不一样的在某些情况下,不一致会出错.

3. 原文的最后应该是nodejs chat.js而不是node chat.js

4. 注意npm安装位置是根据当前文件夹的.所以引用Socket.IO和cookie包的时候容易报路径错误.

5.github

以后可以根据这个例子还实时推送运行状态(r.publish)

来源:部分内容本站原创

原创文章,作者:ifyoung,如若转载,请注明出处:https://www.drugfoodai.com/nodejs1.html

发表评论

邮箱地址不会被公开。 必填项已用*标注