Django:调用print函数时的竞争条件

时间:2017-05-16 10:13:37

标签: python django race-condition

我正在设计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”的某些字段。我认为这是因为竞争条件。请帮我。

2 个答案:

答案 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来做你的高并发性事情......