Python Django:调用打印函数时的竞争条件
我正在设计Django应用程序,其中客户端将发送带有一些数据值的多个POST请求。我已经设计了处理这些数据值的函数。 my view.py的结构如下所示Python Django:调用打印函数时的竞争条件,python,django,race-condition,Python,Django,Race Condition,我正在设计Django应用程序,其中客户端将发送带有一些数据值的多个POST请求。我已经设计了处理这些数据值的函数。 my 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.deco
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)
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
过程_数据函数的结构如下所示
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)
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\u status\u dict”的值会附加上旧“user\u status\u dict”的一些字段。我想那是因为比赛条件。请帮我个忙。你的口述在哪里? 如果dict是模型的实例,则不必担心竞争条件,因为数据库将执行线程安全的操作
除了django在wsgi中提供接口之外,您还可以通过gevent、uwsgi、fastcgi来实现高并发性…print语句的问题。print语句在python中不是线程安全的。因此可能会发生多个线程可以同时在stdout上打印的情况。我使用了中建议的线程安全打印。 下面是带有自定义线程安全打印的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为我提供的大力支持。这没有帮助吗?我已经尝试过了,但它不起作用。如果您不向我们展示引入竞赛条件的实际代码,我们无法帮助您解决竞赛条件。请使用相关代码更新您的问题。
user\u status\u dict
是update\u database()
中的局部变量。没有办法在局部变量上引入竞争条件,因为它只存在于单个函数调用/单个线程的上下文中?您是否使用多个流程?从输出中,我猜多个进程同时写入同一个文件,这导致输出交错。我认为在Python中,在一个进程中使用多个线程是不可能的。