2017-09-15 90 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) 

这些线路将在my_threads循环for内移除元素,因此你不会等待所有线程完成。

如果删除这些行,代码将等待线程正常加入。然后,如果您觉得需要删除线程,则可以在waitForThread返回时执行此操作(例如,使用del)。

回家的教训是不要修改在for循环中循环的元素列表 - 至少不要添加或删除元素。这往往有奇怪的影响。

+0

我严重怀疑,只是删除这些行将使代码基于OP的答案中的不可运行的代码工作。 – martineau

+0

@martineau好的,我修改了我的答案以解决OP中询问的特定问题。 – JohanL