我正在使用线程库,并希望有一个线程可以调用多个线程。这个程序的背景是我有一个摄像头捕获Image并使它们在TCP-SocketServer上的类中可用。
因此,我需要一个运行摄像头捕获的线程和一个运行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 :(得分:4)
你离得很近了! : - )
最新版本的代码中的问题是,当全局results
传递给creator()
时,creator()
从不使用它:它会创建自己的 local < / em> results
列表。当然修改后者对全局results
没有影响,因此一个仍然是空的。所以这里有一个修改它的变体,但也有一些小的局部变化,使代码更多&#34; Pythonic&#34;:
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]