2017-05-16 3 views
1

클라이언트가 여러 데이터 값과 함께 여러 POST 요청을 보내는 Django 응용 프로그램을 설계하고 있습니다.이 데이터 값을 처리하는 함수를 설계했습니다.Django : 인쇄 기능을 호출하는 중 경쟁 조건

{('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'}] 
} 

: 내 view.py의 구조는

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) 

하고 다음과 같은 process_data 함수의 구조 아래 같은 것입니다 때로는 방대한 양의 POST 요청이 도착하면 "user_status_dict"의 값에 이전 "user_status_dict"의 필드 중 일부가 추가됩니다. 나는 그것이 경쟁 조건 때문에라고 생각한다. 제발 날 돌려줘.

+0

This http://stackoverflow.com/questions/1030270/race-conditions-in-django 도움이되지 않습니까? – ettanany

+0

나는 이미 시도했지만 작동하지 않습니다. –

+2

경쟁 조건을 소개하는 실제 코드를 표시하지 않으면 경쟁 조건을 해결하는 데 도움을 줄 수 없습니다. 질문을 관련 코드로 업데이트하십시오. – knbk

답변

0

귀하의 dict는 어디에 정의되어 있습니까? dict이 Models 인스턴스 인 경우 데이터베이스에서 스레드 안전성을 보장하기 때문에 경쟁 조건에 대해 걱정할 필요가 없습니다 django가 wsgi에서 인터페이스를 제공하는 것 외에도 gevent로 높은 동시성을 수행 할 수 있습니다. uwsgi, fastcgi ...

1

print 문에 문제가 있습니다. print 문은 python에서 스레드로부터 안전하지 않습니다. 그래서 많은 스레드가 stdout에서 동시에 인쇄 할 수 있습니다. 제안 된대로 thread safe print를 사용했습니다. 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) 

큰 도움을 주신 것에 감사드립니다.