2017-09-10 4 views
0

を生み出し:機能1は、すでに何かを(呼び出しスレッドを生み出した場合)が私のプログラムは現在、このようなものに見えるスレッドから

from threading import Thread 
import time 

def something(): 
    time.sleep(10) 

def function1(): 
    if condition1: 
     Thread(target=something).start() 


def function2(): 
    if condition2: 
     Thread(target=something).start() 

def function3(): 
    if condition3: 
     Thread(target=something).start() 

def main(): 
    Thread(target=function1).start() 
    Thread(target=function2).start() 
    Thread(target=function3).start() 

main() 

を、私は卵に機能2と3をたくありません何かを呼び出す別のスレッド()。

+0

あなたはおそらく、非ブロッキングセマフォを必要とし、あなたの最初の時間を実行してきたときの状態変数を設定します。 – thebjorn

+0

その言葉は聞かないでください。私はいくつかの研究をする必要があるように見えます。状態変数の考えが私の心を横切った。私は試して応答します。 – rjpj1998

答えて

1

実際のコードでは、わずか3つの独立したスレッドを作成し、これらのスレッドのそれぞれは、(そう、最大で3つのsoemthingスレッドを取得)、次に何かを別のスレッドを作成することができますが、再び互いに完全に独立。 ここで、これらのスレッドが特定のやり方で対話することを尋ねます。「何か」は一度だけ実行する必要があります。したがって、スレッド「何か」は1回だけインスタンス化されなければならず、呼び出しはロックで保護されなければならない。関数スレッドはその「何か」スレッドを知っていなければならないので、main()に「何か」スレッドを作成して関数スレッドに渡す必要があります。 はすべてのすべてで、私は、これは、単純なプログラム構造を与えるだろうし、あなたが達成したいものを修正するためには良いかもしれないとわかりません。

+0

私はスレッドロックを調べなければならないように見えます。上記の答えはこれも参照していました。 – rjpj1998

1

は擬似コードを以下試してみてください。

import threading 
import time 

lock = threading.Lock() 


def something(): 
    time.sleep(10) 


def function1(): 
    if condition1 and lock.acquire(timeout=5): 
     threading.Thread(target=something).start() 


def function2(): 
    if condition2 and lock.acquire(timeout=5): 
     threading.Thread(target=something).start() 


def function3(): 
    if condition3 and lock.acquire(timeout=5): 
     threading.Thread(target=something).start() 


def main(): 
    threading.Thread(target=function1).start() 
    threading.Thread(target=function2).start() 
    threading.Thread(target=function3).start() 


main() 
+0

私はこれを試みますが、それはまれな出来事だと言わなければなりませんが、それが起こるとプログラム全体が震えます。 – rjpj1998

関連する問題