2016-10-12 7 views
1

おはようございます、これは私の最初の質問です。ラズベリー・パイとタッチスクリーンを使用する私の高校で模擬選挙を行うためのシステムを作りました。インターフェイスはTKInterで処理され、結果はgspreadを使用してGoogleシートに追加されます。これにより、さまざまなチャートや分析でデータを処理することができます。複数の同じスプレッドシートへの接続(gspread)

私が実行している問題は、4台のマシンを使用していることです。一度に1つずつ取ると、データがきれいに追加されます。一度に複数のマシンを稼働させると、時々別のマシンを待つだけで、時には4つのうち1つしか記録されません。

異なるマシンから同時に複数の追加をプッシュする設定が良いかもしれませんか?現在、各マシンは他のマシンのミラーです。異なるマシンで異なる認証設定と異なるJSONファイルを作成した方が良いでしょうか?それとも私が行方不明の何か他のものがありますか?シートに書き込むためのリレーコードは以下の通りです。

#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

同じシートにアクセスする複数のプロセスが、このようなブロックを引き起こしてはいけません。実際、私は誤ってスクリプトを終了することができなかった日常的な仕事をしていました。私はそれを発見する頃に、2〜2秒の更新間隔で互いに5〜6回の同じプロセスが戦っていました。つまり、_appending_行ではなく、直接セルを参照していました。単一行のアップロードは遅いです。私はあなたが行にいくつかの競合状態を取得する可能性があり、2番目のプロセスが拒否されるのだろうかと思います。各マシンには、独自のブロックのセルと、アップロードする場所を知る内部カウンタがありますか? – roganjosh

答えて

0

ここで問題となるのは、これらのマシンの4つがすべて同時に起動している場合、シートの状態は比較的似ています。しかし、一台のマシンが変更を加えたら、他のすべてのマシンの状態は実際のシートとは異なります。

シートはN行で始まります。

のMachine1がシートに2行を追加する場合は、行の数はその後、N + 2となる。

しかし

機2-4は、まだシートがN行を持っていると思います!

これらのN行のマシンのいずれかがシートに追加しようとすると、Machine1がシートに書き込んだデータを上書きします。投票を集計しているときには何も起こりません。

シートの状態が変更されたときに各マシンに通知し、状態をリフレッシュするか、すべての付加が行われる単一の連絡先を持つ方法を見つける必要があります。

関連する問題