首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django:启动服务器端计算并动态更新客户端。

Django:启动服务器端计算并动态更新客户端。
EN

Stack Overflow用户
提问于 2017-05-09 13:24:58
回答 2查看 596关注 0票数 1

我正在使用Django (后端)和JavaScript (前端)创建一个web应用程序。

主要场景如下:客户机要求服务器训练一个神经网络(有时需要很长时间:秒甚至几分钟)。在发送请求后,客户端立即向用户显示培训过程的进展情况;它通过检索和显示培训错误(实际上只是一个数字)来实现。

为了训练网络,我创建了这个函数,我将其实现为生成器

代码语言:javascript
运行
复制
def train(network, trainset):
    # [setup variables...]
    while (current_error > target_error):
        # [continue to train the network...]
        # [update current_error...]
        yield current_error

在前端(一个简单的HTML页面),我有一个JS脚本,用于从Django视图动态检索数据。我的Django视图是这样的:

代码语言:javascript
运行
复制
def getError(request):
    # ...
    generator = train(net, dataset)
    return StreamingHttpResponse(generator)

目前,我可以通过AJAX调用检索数据,但在看到训练错误之前,我总是要等待服务器训练整个神经网络。

我的问题是,我希望用户在服务器培训网络时查看错误更新,而不是在培训之后:这就是为什么我将培训函数实现为生成器的原因(这也是我选择返回StreamingHttpResponse的原因)。

当服务器正在计算时,我能做些什么来检索数据呢?具体来说,我想更新前端每次训练生成器yield的数字。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-09 15:15:10

解决方案1:使用芹菜进行计算,将进度存储在redis中,并让您的前端js代码轮询一个视图,该视图将从专用视图中获取进度。

解决方案2:使用websocket。

票数 1
EN

Stack Overflow用户

发布于 2017-05-09 15:01:49

初始分析:

让我们看一下文档:

  1. yield: 在定义生成器函数时使用屈服表达式。
  2. generator: 返回生成器迭代器的函数。它看起来像一个正常的函数,只不过它包含产生一系列值的屈服表达式,这些值可以在for -循环中使用,或者可以用next()函数一次检索一次。

从上述情况可以清楚地看出,您的代码示例工作得很好,但不像预期的那样:

train()函数yields是在完成整个计算之后从getError“传输”到您的前端的generator

基于分析的改革问题:

有了上面提到的这些,您的问题将是获得train()过程的每一步的计算,并将它们显示到前端。

解决方案的框架:

  • 创建一个全局变量(是的,我说了)列表。
  • 重构train()函数以使用前面的列表: train_errors = [] def列车(网络,火车集):#设置变量.同时(current_error > target_error):#继续训练网络.更新current_error..。train_errors.append(current_error)
  • 假设train()位于views.py文件中,重构getError()以返回train_errors列表: 从django.http导入JsonResponse def getError(请求):#.返回JsonResponse(train_errors,safe=False) 我使用JsonResponse,但可以随意使用任何适合您的东西。
  • 通过使用javascript的setInterval,使前端每N秒重复AJAX调用一次,并显示与先前数据状态的差异。 使用实例: var myIntervalCall = setInterval(myAJAXcall,500);函数myAJAXcall{ //在这里创建AJAX调用,并且有足够的代码显示接收到的数据上的更改。} 上面的代码将使myAJAXcall到后端,每一个0.5 sec

以上将允许您对您的问题进行初步的处理,您可以/必须扩展到这个(野蛮的)解决方案上。

EDIT/Disclaimer (由于@George和@brunodesthuilliers的评论):

上述,不是一个好的解决方案!!这只是一个快速的解决方案,让作者“摆脱”他目前的问题,并帮助他继续他的发展。

“解决方案”为思维过程提供了基础,考虑到手头的问题(作者目前的实际问题),因此提供了一种最低限度和初步的解决办法。

前面提到的问题是:不把这个解决方案当作佳能!--这只是一个“跳跃式启动”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43871140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档