django/python:从字典获取值时出错

django/python:从字典获取值时出错,python,django,dictionary,dotcloud,openshift,Python,Django,Dictionary,Dotcloud,Openshift,我在dotcloud和redhat openshift上托管了python/django代码。为了处理不同的用户,我使用令牌并将其保存在字典中。但是当我从dict得到值时,它有时会抛出一个errorkey-value错误 import threading thread_queue = {} def download(request): dl_val = request.POST["input1"] client_token = str(request.POST["pageco

我在dotcloud和redhat openshift上托管了python/django代码。为了处理不同的用户,我使用令牌并将其保存在字典中。但是当我从dict得到值时,它有时会抛出一个errorkey-value错误

import threading

thread_queue = {}

def download(request):
    dl_val = request.POST["input1"]
    client_token = str(request.POST["pagecookie"])
        # save client token as keys and thread object as value in dictionary
    thread_queue[client_token] = DownloadThread(dl_val,client_token)
    thread_queue[client_token].start()
    return render_to_response("progress.html",
              { "dl_val" : dl_val, "token" :      client_token })
下面的代码通过javascript xmlhttprequest以1秒的间隔执行到服务器。 它将检查另一个线程中的变量,并将值返回到用户页面

def downloadProgress(request, token):
        # sometimes i use this for check the content of dict
    #resp = HttpResponse("thread_queue = "+str(thread_queue))
    #return resp
    prog, total = thread_queue[str(token)].getValue() # problematic line !
    if prog == 0:
                # prevent division by zero
        return HttpResponse("0")
    percent = float(prog) / float(total)
    percent = round(percent*100, 2)
    if percent >= 100:
        try:
            f_name = thread_queue[token].getFileName()[1]
        except:
            downloadProgress(request,token)
        resp = HttpResponse('<a href="http://'+request.META['HTTP_HOST']+
                            '/dl/'+token+'/">'+f_name+'</a><br />')
        return resp
    else:
        return HttpResponse(str(percent))
它有时会成功:

thread_queue = {'wFVdMDF9a2qSQCAXi7za': , 'EVukb7QdNdDgCf2ZtVSw': , 'C7pkqYRvRadTfEce5j2b': , '2xPFhR6wm9bs9BEQNfdd': } 
当我通过manage.py runserver在本地运行django并使用google chrome访问它时,我从未得到过这个结果,但当我将它上传到dotcloud或openshift时,它总是会出现上述问题。 我的问题:

我怎样才能解决这个问题? dotcloud和openshift是否限制了它们的python cpu使用? 或者问题在python字典中?
谢谢。

假设dotcloud和openshift运行您代码的多个进程;这些进程之间不会共享dict

请注意,这也意味着额外的进程也将无法访问您的额外进程


改用外部数据库获取此类信息。对于这些长期运行的异步作业,您还需要在单独的工作进程中运行它们。例如,看看芹菜,它是异步作业处理的一体式解决方案。

假定dotcloud和openshift运行代码的多个进程;这些进程之间不会共享dict

请注意,这也意味着额外的进程也将无法访问您的额外进程


改用外部数据库获取此类信息。对于这些长期运行的异步作业,您还需要在单独的工作进程中运行它们。例如,看看芹菜,它提供了一个用于异步作业处理的多功能一体解决方案。

对于python服务,dotCloud默认有4个工作进程。在本地运行dev服务器时,您只运行一个进程。正如@martijn所说,您的问题与以下事实有关:您的dict不会在这些进程之间共享

要解决此问题,可以使用redis或memcached之类的工具来存储此信息。如果您需要更长期的存储解决方案,那么使用数据库可能更合适

dotCloud不限制CPU的使用,CPU在同一台主机上共享,并允许爆发,但最终每个人都有相同数量的CPU

查看您的代码,在访问dict之前,您应该检查以确保dict中有值,或者至少在代码周围环绕一个try-except块,以处理数据不存在的情况

str_token = str(token)
if str_token in thread_queue:
   prog, total = thread_queue[str_token].getValue() # problematic line !
else:
   # value isn't there, do something else 

对于python服务,dotCloud默认有4个工作进程。在本地运行dev服务器时,您只运行一个进程。正如@martijn所说,您的问题与以下事实有关:您的dict不会在这些进程之间共享

要解决此问题,可以使用redis或memcached之类的工具来存储此信息。如果您需要更长期的存储解决方案,那么使用数据库可能更合适

dotCloud不限制CPU的使用,CPU在同一台主机上共享,并允许爆发,但最终每个人都有相同数量的CPU

查看您的代码,在访问dict之前,您应该检查以确保dict中有值,或者至少在代码周围环绕一个try-except块,以处理数据不存在的情况

str_token = str(token)
if str_token in thread_queue:
   prog, total = thread_queue[str_token].getValue() # problematic line !
else:
   # value isn't there, do something else 

在我的代码中,我将线程对象存储在dict中。我可以使用与redis相同的方法来存储我的线程对象吗?@alvin,如果你的线程对象可以被pickle,那么你可以对它进行pickle,并将它存储在redis中,就像你在本地dict中存储它一样,你的密钥将与你今天使用的令牌相同,值将是你的pickle对象。当你想要的时候,你可以把值拉出来,解开它,然后你就可以像以前一样使用它。在我的代码中,我把线程对象存储在dict中。我可以用redis的同样方法来存储我的线程对象吗?@alvin,如果你的线程对象可以被pickle,你可以将它pickle,并以与存储在本地dict中相同的方式存储在redis中,您的密钥将与您今天使用的令牌相同,值将是您的pickle对象。当您需要它时,您可以将该值拉出,取消勾选,然后像以前一样使用它。