2017-06-15 131 views
0
import time 
from threading import Thread 

def s_process(): 
    print('***********************************************') 
    ##time.sleep(2) 
    print('###############################################') 
    ##time.sleep(2) 
    return 

a = Thread(target=s_process) 

while(True): 
    a.start() 
    a.join() 
    a.start() 
    a.join() 

爲什麼這個代碼導致錯誤蟒蛇線程(join()方法而不是等待線程結束?)

*********************************************** 
############################################### 
Traceback (most recent call last): 
    File "xxxxxxxxxxxxxxxxxxxxx", line 16, in <module> 
    a.start() 
RuntimeError: threads can only be started once 

應該不會加入()等到線程完成。如果我有誤解怎麼加入()的作品,我應該如何等待線程不使用超時

+0

你的代碼改成這樣 ** 而(真): 一個線程=(目標= s_process) a.start() a.join() ** – Stack

+1

的錯誤不是在'加入'行,它在'start'行。對我來說這似乎不言自明:不要在同一個對象上調用兩次'start'。如果必須創建一個新的線程對象。 – Kevin

+0

您只定義了1個線程'a',並且您已經開始並稱其爲join()方法。不能再次啓動它! – pstatix

回答

0

完成這應該工作:

import time 
from threading import Thread 

def s_process(): 
    print('***********************************************') 
    ##time.sleep(2) 
    print('###############################################') 
    ##time.sleep(2) 
    return 

while(True): 
    a = Thread(target=s_process) 
    a.start() 
    a.join() 
    del a   #deletes a 
+0

創建如此多的線程對象是否安全?他們會亂用內存使用情況嗎?或者他們在完成後得到清理 – confusedsnek

+0

** del a **將清理 – Stack

+0

,但此方法一次創建1個線程。那麼創建1個線程有什麼意義?爲什麼不直接調用's_process'? –

0

要啓動多個線程,建立threading.Thread對象的列表和使用for圈像這樣重申他們start()join()方法:

import time 
from threading import Thread 

def s_process(): 
    print('***********************************************') 
    time.sleep(2) 
    print('###############################################') 
    time.sleep(2) 
    return 

# list comprehension that creates 2 threading.Thread objects 
threads = [Thread(target=s_process) for x in range(0, 2)] 

# starts thread 1 
# joins thread 1 
# starts thread 2 
# joins thread 2 
for thread in threads: 
    try: 
     thread.start() 
     thread.join() 
    except KeyboardInterrupt: # std Python exception 
     continue # moves to next thread iterable 

編輯:try/except 0 Inlcuded,並用通用的Ctrl + X + C進行測試。

+0

我需要循環相同的代碼,而不會在執行中途中斷。KeyboardInterrupt – confusedsnek

+1

編輯包括現在針對您的線程的異常處理。 – pstatix