2017-04-25 14 views
0

私は、任意の数のクライアントがサーバーに要求を送信するコードを書いています。サーバーは情報を1つの辞書に集め、これらのクライアントに返信を返します。サーバが接続を監視しますマルチスレッド同期問題を持つPythonソケット

  1. :私がこれまで行ってきた何

    は、ということです。

  2. 新しい接続を受け付けるたびに、新しいスレッドが作成されます。
  3. 各スレッドにメッセージが受信され、情報が辞書に格納されます。
  4. 次に、サーバーはディクショナリ内の値の返答番号を返します。

クライアントが受け取る値の数は、すべてのスレッド間で辞書を共有する必要があるため、同じにする必要があります。

私が直面しているエラーは、辞書が共有された方法でアクセスされていないことです。私が直面していることが競合状態と呼ばれることを知る必要があります。 私はロック、RLocks、条件変数を使ってみましたが、動作しませんでした。

どうすればいいですか?次の操作を実行するために、私はThreadクラスを継承し、(実行を上書きしたスレッドのために

):

[擬似コード]

def run(self): 
    data = sock.recv(1024) 
    dc["vals"].append(data) 
    # dc is shared dictionary and values are list 
    dr = self.processStrings(dc) #need to access all values after updates from all threads 
    sock.sendall(dr) #this has to be sent to different individual clients back 
+0

実行可能コードを共有できますか? –

+0

実行可能コードを投稿することができない可能性があります。これは盗聴検出器でチェックされるためです。したがって、割り当ての失格となる可能性があります。 –

+0

競争条件を脇に、なぜあなたはすべてのクライアントのために同じ価値を期待していますか?私は新しいクライアントのそれぞれが一つの要素で辞書を増やすことを期待しています。これにより、返される数字はますます増えていきます。それ以外の場合は、すべてのクライアントが接続して応答する準備ができているかどうかをどのように知ることができますか? – JohanL

答えて

0

チェックこのアウト:

import time 
import threading 

data = { 
    'key': [] 
} 


class Thread(threading.Thread): 

    def __init__(self, index): 
     super(Thread, self).__init__() 
     self.index = index 

    def run(self): 
     time.sleep(0.01) 
     data['key'].append(self.index) 


if __name__ == '__main__': 
    for i in range(10): 
     t = Thread(i) 
     t.start() 
     t.join() 

は、あなたが電話しましたスレッドを開始するときはthread.join?

+0

't.join()' do –

+0

@SakshamKumar thread.join()は、MainThreadが終了する前にChildThreadの実行が完了するのを待つ必要があることを意味します。 – gushitong