2017-04-14 59 views
2

我正在使用線程庫並希望有一個線程將調用多個線程。這個程序的背景是我有一個攝像頭捕捉圖像,並使它們在TCP-SocketServer上的類中可用。在Python中創建線程中的線程

因此,我需要一個運行相機捕獲的線程和運行TCPServer的第二個線程,但在此線程中,每個傳入連接都有幾個線程。

最後一個線程意味着我需要一個線程可以創建線程。不幸的是,這沒有奏效。

我設法打破巨大的代碼放到一個小片段代表了問題:

import threading 

def adder(x,res,i): 
     res[i] = res[i] + x*i; 

def creator(a,threads,results): 
    results = [] 
    for i in range(0,a): 
     results.append(0) 
     threads.append(threading.Thread(target=adder,args=(a,results,i))) 
     threads[i].start() 
    for i in range(0,len(threads)): 
     threads[i].join() 

    return results; 


threads = []; 
results = []; 

mainThread = threading.Thread(target=creator,args=([5,threads,results])) 
mainThread.start() 

mainThread.join() 
for i in range(0,len(results)): 
    print results[i] 
    print threads[i] 

在功能creator這被稱爲一個線程應該有與功能可按adder創建多個線程。

但結果是空的,爲什麼這樣呢?

這是我的大型程序中發生的同樣的問題。

+0

Python的線程有沒有這樣的方法('.terminate()') - 不管他們是否已經已經開始。請參閱:http://stackoverflow.com/questions/323972/is-there-any-way-to-kill-a-thread-in-python –

+0

Python線程沒有'.stop()'方法 - 您編輯的代碼_現在應該提出一個例外。請參閱我已經提供的鏈接:Python不支持強制線程停止的內置方式。 –

+0

奇怪的是,它的工作。不過,我現在將線程替換爲只具有簡單任務並等待所有線程加入的線程,但結果仍爲空,現在我得到通知:NoneType沒有函數,稱爲加入 – Kev1n91

回答

3

您靠近了! :-)

代碼的最新版本的問題是,雖然全球results傳遞給creator()creator()從來沒有使用它:它會創建自己本地results列表。當然,修改後者對全局results沒有影響,因此其中一個保持空白。因此,這裏的變化來修復,但也有局部輕微的變化,以使代碼更「Python化」:

import threading 

def adder(x, res, i): 
    res[i] += x*i 

def creator(a, threads, results): 
    for i in range(a): 
     results.append(0) 
     t = threading.Thread(target=adder, args=(a, results, i)) 
     threads.append(t) 
     t.start() 
    for t in threads: 
     t.join() 

threads = [] 
results = [] 

mainThread = threading.Thread(target=creator, args=(5, threads, results)) 
mainThread.start() 
mainThread.join() 
for i in range(len(results)): 
    print results[i] 
    print threads[i] 
+0

當然,非常感謝你的不斷幫助 – Kev1n91