2017-09-15 16 views
0

メインスレッドは、内部スレッドをPythonで起動した後に待機させる方法を教えてください。メインスレッドを開始した後、内部スレッドを待機させる方法は?

私はこのためにjoinを使用しますが、正しく動作しません。内部スレッドがtime.sleep()を呼び出すため発生したと思います。 アイデア?ここで

は、コードのブロックボックスです:

def execution(start,end): 
    for i in range (start,end): 
     main() 
    return 

def waitForThread(delay,my_threads): 
    time.sleep (delay) 
    for t in my_threads: 
     t.join() 
     if t in my_threads: 
      my_threads.remove (t) 
    return 

def task(user,sleep): # it has multiple time.sleep() 
    #do some actions 
    time.sleep() 
    #do some actions 
    time.sleep() 
    return 

def main(): 
    threads=[] 
    for user in accounts: 
     t = Thread (target=task,args=(sleep-time,user)) 
     t.start() 
     threads.append (t) 
    waitForThread (130,threads) 

    ## I want the code stop here and when the execution of threads finished continue 

    ## doing other staff here 

    return 

if __name__ == '__main__': 
    execution(1,30) 

答えて

2

機能

def waitForThread(delay,my_threads): 
    time.sleep (delay) 
    for t in my_threads: 
     t.join() 
     if t in my_threads: 
      my_threads.remove (t) 
    return 

が魚に見えます。特にライン

 if t in my_threads: 
      my_threads.remove (t) 

これらの行は、forループ内my_threadsから要素を削除し、すべてのスレッドが終了するのをので、あなたは待つことはありません。

これらの行を削除すると、コードはスレッドが正しく結合するのを待ちます。スレッドを削除する必要があると思われる場合は、waitForThreadが返されたときにスレッドを削除することができます(例:delを使用)。

take-homeレッスンでは、少なくとも要素を追加または削除しないで、forループ内でループする要素のリストを変更しないでください。それはしばしば奇妙な影響を与えます。

+0

私は真にこれらの行を削除するだけで、OPの答えの中でunrunnableコードだけに基づいてコードを動作させることに疑念があります。 – martineau

+0

@martineau [OK]を、私はOPで尋ねられた特定の問題に対処するために私の答えを変更しました。 – JohanL

関連する問題