在Python中创建线程内的线程

11
我正在使用线程库,并希望有一个线程来调用多个线程。这个程序的背景是,我有一个相机,它捕获图像并在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创建多个线程。
然而结果为空,为什么会这样呢?
这是我较大程序中出现的同样问题。

Python线程没有这样的方法(.terminate()) - 无论它们是否已经启动。请参见此处:https://dev59.com/wXRC5IYBdhLWcg3wW_pk - Tim Peters
Python线程也没有.stop()方法 - 您编辑的代码现在应该会引发异常。请参见我已经提供的链接:Python不支持内置的强制停止线程的方法。 - Tim Peters
奇怪的是它起作用了。但是现在我已经将线程替换为一个只有简单任务并等待所有线程加入的线程,然而结果仍然为空,并且我现在收到了NoneType没有名为join的函数的通知。 - Kev1n91
你正在将 start 的返回值附加到 threads - user2357112
你没有等待 mainThread 结束,所以实际的主线程全速前进,你可能在其他线程有机会启动之前就打印了 results - Tim Peters
显示剩余2条评论
1个回答

16

你很接近了!:-)

最新版本的代码问题在于,虽然全局变量results被传递给了creator(),但是creator()从未使用它:它创建了自己的本地results列表。当然,修改后者对全局results没有影响,因此全局变量仍然为空。因此,这里提供一种修复方案,同时对代码进行了轻微的本地更改,使其更符合“Pythonic”的风格:

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接