【问题标题】:Python-Django -the service of generating random numbers does not stops?Python-Django——生成随机数的服务不停歇?
【发布时间】:2013-08-26 09:44:28
【问题描述】:

我试图在单击start 按钮时打印随机值,并通过单击stop 按钮停止它。 Start 按钮按预期工作,即在单击时打印随机值,但是当单击stop 按钮时,它不会跳出循环(尽管它进入stop 部分)并继续打印随机值。如何停止打印随机值并重新开始。??

我的代码的简短摘要:- 在 vi​​ews.py 中,请求了 signal 变量,然后将其发送到生成随机数的 generate_random_temperature 函数。生成数字工作正常,但它无法停止生成数字的服务。

我怎样才能阻止它?

HTML 文件

    <form type = "POST">
        {% csrf_token %}    
        <input type="text" placeholder = "Enter City Name" id = "city_name">
        <input type="submit" value = "start" id="submit">
        <input type="reset" value = "Stop" id="stop">

    </form>

JS 文件

$(function(){

    $("#start").click(function (event) {
        event.preventDefault();
        $.ajax({
            type: "POST",
            url: "/dashboard/",
            data : { 'city_name' : $("#city_name").val(),
                     'signal' : "True"
                   },

               });
    });

    $("#stop").click(function (event) {
        event.preventDefault();
        $.ajax({
            type: "POST",
            url: "/dashboard/",
            data : { 'city_name' : $("#city_name").val(),
                     'signal' : "False"
                   },

               });
    });
});

services.py

def generate_random_temperature(city_name, status):

    city = City.objects.filter(city_name = city_name)

    for data in city:
        status = data.status

    print status
    if status == "True" :
        while(1):
            print randrange(1,51)
            time.sleep(5)   
    elif status == "False" :
        print "Exiting"

views.py

def dashboard(request):

if request.is_ajax():
    status = request.POST['status']
    city_name = request.POST['city_name']

    city = City.objects.filter(city_name = city_name)
    for data in city:
        data.status = status
        data.save()
    generate_random_temperature(city_name, status)


ctx = {}
return render_to_response('dashboard/dashboard.html',ctx, context_instance = RequestContext(request))

输出

True             // When Start button is clicked, service is started
25
13
False           // When Stop button is clicked, it enters the else section, prints Exiting , but then again starts printing numbers. It does not breaks out of the while loop.
Exiting
[23/Aug/2013 05:38:33] "POST /dashboard/ HTTP/1.1" 200 2363
45
25
26
31

【问题讨论】:

  • 表示每次条件为 True ,而 1 也表示每次满足 1 ,所以它会打印随机数直到无穷大。
  • 但我也添加了一个break,它不会执行(尽管当条件为“false”且具有中断条件时流程进入else部分)?
  • 条件“假”表示点击停止按钮时
  • 你有没有尝试在循环之前添加一些异常
  • 检查新的解决方案

标签: python django


【解决方案1】:

你的逻辑/理解不正确。

您编写服务的方式,当浏览器发送启动请求时,它永远不会得到对该请求的响应。简而言之,dashboard() 视图的请求处理程序永远不会返回响应。那是因为generate_random_temperature() 在使用signal=True 调用时永远不会返回。

您必须考虑一些不同的逻辑来启动服务并从函数返回,可能是不同的线程。并且信号应该在线程/进程之间共享,具体取决于您的部署(每个请求都作为 cgi 运行,它可能在网络服务器中作为不同的进程/线程运行)。

【讨论】:

  • 什么?永远不回来?我一开始不想有任何回报。因为,我已经显示了输出,服务确实启动了,这意味着它打印生成的随机数,但它无法停止/跳出循环,尽管它进入了else 部分。
【解决方案2】:

当第一次请求启动服务时,该服务将永远持续下去。它根本没有办法跳出循环,因为signal 不能在对函数的调用中改变

第二次调用确实会进入stop 分支,但这无关紧要,因为最初的调用仍在继续。

您需要的是一些可以在循环外设置并在循环内检查的共享数据。也许您可以使用数据库:存储一个“状态”对象,并在发送stop 时将其设置为“停止”。然后在生成器的每个循环中,您都需要从数据库中获取该对象,并检查其状态。

(如果你能保证你在单线程环境中运行,那么这里使用全局变量会更好,但 Django 部署不太适合。)

【讨论】:

  • 好吧,我有 2 个问题。 1:) 为什么第一个生成数字的服务即使在单击停止按钮后仍然继续,尽管提供了一个中断以使其脱离循环? 2:)您将状态保存在数据库中的想法似乎可行,但我想确认这种方法在真实环境中是否有效?
  • 但我解释了问题 1 的答案。该循环将永远退出,​​因为该调用永远不会返回。停止按钮是另一个调用,它立即返回,但第一个继续。
  • 我明白了,但是有没有办法纠正这个代码,而不考虑数据库解决方案?
  • 我试过你的数据库解决方案,但同样的问题似乎又出现了!!你能调查一下吗。谢谢
  • 再次检查问题。我已经用我尝试过的数据库代码进行了编辑
猜你喜欢
  • 2021-08-14
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 2016-05-24
  • 2016-08-13
  • 1970-01-01
相关资源
最近更新 更多