在Python中创建线程内的线程

时间:2017-04-14 21:35:37

标签: python multithreading

我正在使用线程库,并希望有一个线程可以调用多个线程。这个程序的背景是我有一个摄像头捕获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创建的线程。

然而结果是空的,为什么会这样呢?

这与我的大型程序中出现的问题相同。

1 个答案:

答案 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]