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

2024-04-24 16:52:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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秒的间隔执行到服务器。 它将检查另一个线程中的变量并将值返回给用户页。在

^{pr2}$

测试几天后,它有时会返回:

thread_queue = {}

它有时会成功:

thread_queue = {'wFVdMDF9a2qSQCAXi7za': , 'EVukb7QdNdDgCf2ZtVSw': , 'C7pkqYRvRadTfEce5j2b': , '2xPFhR6wm9bs9BEQNfdd': } 

当我通过在本地运行django时,我从来没有得到这个结果管理.py但是当我上传到dotcloud或openshift时,总是会出现上述问题。 我的问题:

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

谢谢。在


Tags: django代码用户clienttoken字典queuerequest
2条回答

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

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

请使用外部数据库来存储此类信息。对于长时间运行的异步作业,您还需要在单独的工作进程中运行它们。例如,请参考Celery,以获得异步作业处理的一体式解决方案。在

对于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 

相关问题 更多 >