2016-10-12 2 views
1

안녕하세요, 제 첫 번째 질문입니다. 나와 함께하시기 바랍니다! 고등 학교에서 나무 딸기 파이와 터치 스크린을 사용하는 모의 선거를위한 시스템을 만들었습니다. 인터페이스는 TKInter를 통해 처리되며 그 결과는 gspread를 사용하여 Google 시트에 추가됩니다. 그러면 다양한 차트와 분석으로 데이터를 처리 할 수 ​​있습니다.동일한 스프레드 시트에 여러 개의 연결 (gspread)

제가 겪고있는 문제는 4 대의 기계를 사용하고 있다는 것입니다. 한 번에 하나씩 가져 가면 데이터를 잘 덧붙입니다. 한 번에 여러 대의 기계를 사용하는 경우 가끔씩 다른 기계를 기다리는 경우가 있으며 때로는 4 개 중 1 개만 기록됩니다.

다른 컴퓨터에서 여러 개의 추가를 동시에 푸시하도록 설정하는 것이 더 좋습니까? 현재 각 기계는 다른 기계의 거울입니다. 각기 다른 인증 설정과 각기 다른 JSON 파일을 작성하면 더 효과가 있습니까? 아니면 제가 놓친 다른 것이 있습니까? 시트에 쓰는 데 필요한 relatent 코드는 다음과 같습니다.

#while True: 
    # Login if necessary. 
    if worksheet is None: 
     worksheet = login_open_sheet(GDOCS_OAUTH_JSON, GDOCS_SPREADSHEET_NAME) 

    # Append the data in the spreadsheet, including a timestamp 
    try: 
     worksheet.append_row((datetime.datetime.now(), gender, grade, party, vote)) 
    except: 
     # Error appending data, most likely because credentials are stale. 
     # Null out the worksheet so a login is performed at the top of the loop. 
     print('Append error, logging in again') 
     worksheet = None 

감사합니다.

+0

동일한 시트에 액세스하는 여러 프로세스가 이와 같이 차단을해서는 안됩니다. 실제로, 나는 실수로 종료하지 못한 스크립트에서 매일 cron 작업을 수행했으며, 발견 할 때까지는 2 ~ 2 초 간격으로 서로 5 ~ 6 개의 동일한 프로세스가 서로 싸우고있었습니다. 즉, _appending_ 행이 아닌 직접 셀을 참조했습니다. 단일 행의 업로드가 느립니다. 난 당신이 행에 몇 가지 경쟁 조건을 얻을 가능성이 있는지 궁금해하고 두 번째 프로세스가 거부됩니다. 각 기계가 자체 블록을 가질 수 있고 업로드 할 위치를 알 수있는 내부 카운터가있을 수 있습니까? – roganjosh

답변

0

이 기계는 4 대의 기계가 모두 동시에 시작되는 경우 시트의 상태가 비교적 유사 할 것입니다. 그러나 한 대의 기계가 변경되면 다른 모든 기계의 상태가 실제 시트와 달라집니다.

시트가 N 개의 행으로 시작한다고 가정 해 보겠습니다.

머신 1은 시트에 2 개 행을 추가하는 경우의 행의 수가 다음 N + 2가된다

BUT

기계 2-4 여전히 시트 N 행 있다고 생각!

이러한 N 행 컴퓨터가 시트에 추가하려고하면 Machine1이 시트에 쓴 데이터를 덮어 쓰게됩니다. 투표 수를 집계 할 때 분명히 원하지 않는 것이 아닙니다.

시트의 상태가 변경되었을 때 각 시스템이이를 알도록하고 상태를 새로 고치거나 모든 추가가 이루어진 단일 연락처 지점을 찾아야합니다.

관련 문제