2017-09-13 8 views
0

APIから2つのデータストリームが得られるので、3つのスレッド、メインストリーム、ストリーム1およびストリーム2があります。 Stream1とStream2はこのデータを処理する必要があり、処理が完了すると、main_value1とmain_value2に格納します。マルチスレッド中に変数を読み取る

メインスレッドからは、いつでも最後の値を読み取る必要があります(この値が必要な場合は処理中ですが、最後に処理/保存された値が得られます)。

def stream1(): 
    while True: 
     main_value1 = process() 
def stream2(): 
    while True: 
     main_value2 = process2() 
def get_main_value1(): ? 
def get main_value2(): ? 
def main(): 
    threading.Thread(function=stream1,).start() 
    threading.Thread(function=stream2).start() 
    while True: 
     time.sleep(random.randint(0,10)) 
     A = get_main_value1() 
     B = get_main_value2() 

答えて

0

)ここでのコード例から、私は機能get_main_value1を(コーディングで助けを必要とする)と、もちろん、get_main_value2(一つの方法は、彼らが地球にするために、次のようになります。

STREAM1_LAST_VALUE = None 
def stream1(): 
    global STREAM1_LAST_VALUE 
    while True: 
     main_value1 = process() 
     STREAM1_LAST_VALUE = main_value1 

STREAM2_LAST_VALUE = None 
def stream2(): 
    global STREAM2_LAST_VALUE 
    while True: 
     main_value2 = process2() 
     STREAM2_LAST_VALUE = main_value2 

def get_main_value1(): 
    return STREAM1_LAST_VALUE 

def get main_value2(): 
    return STREAM2_LAST_VALUE 

def main(): 
    threading.Thread(function=stream1,).start() 
    threading.Thread(function=stream2).start() 
    while True: 
     time.sleep(random.randint(0,10)) 
     A = get_main_value1() 
     B = get_main_value2() 
+0

おそらくそれは愚かな質問です:関数によって設定されている間にこの値が必要な場合はどうすればよいですか?何が起こるか、またはこれは起こることが不可能ですか? –

+0

@FroidDymylja分かりません。私のコードを見れば、 'process2()'は 'STREAM2_LAST_VALUE'を上書きする値を返します。したがって、中間状態は不可能である。また、 'process2()'は常に最後の値も見るので、安全に使うことができます。 'STREAM2_LAST_VALUE'オブジェクトの更新を直接行うと、矛盾が生じる可能性があります。簡単な読み書きの一貫性はPythonで保証されています。 – freakish

+0

_ "単純な読み書きの一貫性はPythonで保証されています" _?あなたはこれを読むためのリンクを提供できますか? – stovfl

関連する問題