Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:调用打印函数时的竞争条件_Python_Django_Race Condition - Fatal编程技术网

Python Django:调用打印函数时的竞争条件

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

我正在设计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.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中,在一个进程中使用多个线程是不可能的。