我在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运行代码的多个进程;dict不会在这些进程之间共享。在
请注意,这也意味着额外的进程将无法访问您的额外胎面。在
请使用外部数据库来存储此类信息。对于长时间运行的异步作业,您还需要在单独的工作进程中运行它们。例如,请参考Celery,以获得异步作业处理的一体式解决方案。在
对于python服务,dotCloud默认有4个工作进程。在本地运行dev服务器时,您只运行一个进程。就像@martijn说的,你的问题与你的dict不会在这些进程之间共享这一事实有关。在
要解决这个问题,可以使用redis或memcached之类的东西来存储这些信息。如果您需要更长期的存储解决方案,那么使用数据库可能更适合。在
dotCloud不限制CPU的使用,CPU是在同一台主机上共享的,并且允许爆发,但最终每个人的CPU数量都是一样的。在
查看您的代码,在访问dict之前,您应该检查确保dict中有一个值,或者至少在代码周围加上try except块,以处理数据不存在时的情况。在
相关问题 更多 >
编程相关推荐