我正在设计Django应用程序,其中客户端将发送带有一些数据值的多个POST请求。我设计了处理此数据值的函数。 我的view.py的结构如下所示,
from django.http import HttpResponse
from django.shortcuts import render
from django.template import loader
from django.template import RequestContext
from django.views.decorators.csrf import csrf_exempt
from update_database import update_database
import time
@csrf_exempt
def index(request):
if request.body:
update_database(get_username(),request.body)
addStatusPage = loader.get_template('add_status.html')
return HttpResponse(addStatusPage.render(RequestContext(request)))
def get_username():
username = "james"
return(username)
process_data函数的结构如下所示,
import ast
def update_database(username,request_dict):
user_status_dict = {}
user_status_dict_key = {}
user_status_dict_val = []
request_dict = ast.literal_eval(request_dict)
user_status_dict_key = (username,)
user_status_dict_key += (request_dict["date"],)
user_status_dict_val = [request_dict["date"],request_dict["dept"],request_dict["release"]]
user_status_dict[user_status_dict_key] = user_status_dict_val
print user_status_dict
另见输出:
{('james', '17/07/2016'): ['17/07/2016', 'OneCell', '1']}
{('james', '17/07/2016'): ['17/07/2016', 'OneCell', '1']}
{('james', '17/07/2016'){('james', '17/07/2016'): ['17/07/2016', : 'OneCell'[, '17/07/2016', 'OneCell''1', ]'1'}]
}
有时,当大量POST请求到达时,“user_status_dict”的值会附加旧“user_status_dict”的某些字段。我认为这是因为竞争条件。请帮我。
答案 0 :(得分:1)
print语句的问题。在python中,print语句不是线程安全的。因为很多线程可能同时在stdout上打印。我使用了Python 2.7: Print thread safe中建议的线程安全打印。 下面是带有自定义线程安全打印的update_database()函数。
from __future__ import print_function
import ast
import sys
print = lambda x: sys.stdout.write("%s\n" % x)
def update_database(username,request_dict):
user_status_dict = {}
user_status_dict_key = ()
user_status_dict_val = []
request_dict = ast.literal_eval(request_dict)
user_status_dict_key = (username,)
user_status_dict_key += (request_dict["date"],)
user_status_dict_val = [request_dict["date"],request_dict["dept"],request_dict["release"]]
user_status_dict[user_status_dict_key] = user_status_dict_val
print(user_status_dict)
感谢knbk给予我很大的支持。
答案 1 :(得分:0)
你的dict定义在哪里? 如果dict是Models的一个实例,你不必担心竞争条件,因为数据库将执行线程安全 除了django在wsgi中提供一个接口之外,你可以通过gevent,uwsgi,fastcgi来做你的高并发性事情......