我正在使用Django (后端)和JavaScript (前端)创建一个web应用程序。
主要场景如下:客户机要求服务器训练一个神经网络(有时需要很长时间:秒甚至几分钟)。在发送请求后,客户端立即向用户显示培训过程的进展情况;它通过检索和显示培训错误(实际上只是一个数字)来实现。
为了训练网络,我创建了这个函数,我将其实现为生成器。
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视图是这样的:
def getError(request):
# ...
generator = train(net, dataset)
return StreamingHttpResponse(generator)目前,我可以通过AJAX调用检索数据,但在看到训练错误之前,我总是要等待服务器训练整个神经网络。
我的问题是,我希望用户在服务器培训网络时查看错误更新,而不是在培训之后:这就是为什么我将培训函数实现为生成器的原因(这也是我选择返回StreamingHttpResponse的原因)。
当服务器正在计算时,我能做些什么来检索数据呢?具体来说,我想更新前端每次训练生成器yield的数字。
发布于 2017-05-09 15:15:10
解决方案1:使用芹菜进行计算,将进度存储在redis中,并让您的前端js代码轮询一个视图,该视图将从专用视图中获取进度。
解决方案2:使用websocket。
发布于 2017-05-09 15:01:49
初始分析:
让我们看一下文档:
yield:
在定义生成器函数时使用屈服表达式。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,但可以随意使用任何适合您的东西。setInterval,使前端每N秒重复AJAX调用一次,并显示与先前数据状态的差异。
使用实例:
var myIntervalCall = setInterval(myAJAXcall,500);函数myAJAXcall{ //在这里创建AJAX调用,并且有足够的代码显示接收到的数据上的更改。}
上面的代码将使myAJAXcall到后端,每一个0.5 sec。以上将允许您对您的问题进行初步的处理,您可以/必须扩展到这个(野蛮的)解决方案上。
EDIT/Disclaimer (由于@George和@brunodesthuilliers的评论):
上述,不是一个好的解决方案!!这只是一个快速的解决方案,让作者“摆脱”他目前的问题,并帮助他继续他的发展。
“解决方案”为思维过程提供了基础,考虑到手头的问题(作者目前的实际问题),因此提供了一种最低限度和初步的解决办法。
前面提到的问题是:不把这个解决方案当作佳能!--这只是一个“跳跃式启动”。
https://stackoverflow.com/questions/43871140
复制相似问题