如何在Python中多次调用线程?

时间:2010-11-08 08:13:37

标签: python multithreading

如果这是一个愚蠢的问题,我很抱歉。我试图使用多个类的多线程来完成不同的工作,这涉及多次在不同的时间调用这些多线程。但我不确定使用哪种方法。代码如下所示:

class workers1(Thread):  
    def __init__(self):  
        Thread.__init__(self)  
    def run(self):  
        do some stuff  

class workers2(Thread):  
    def __init__(self):  
        Thread.__init__(self)  
    def run(self):  
        do some stuff  

class workers3(Thread):  
    def __init__(self):  
        Thread.__init__(self)  
    def run(self):
        do some stuff  

WorkerList1=[workers1(i) for i in range(X)]  
WorkerList2=[workers2(i) for i in range(XX)]  
WorkerList2=[workers3(i) for i in range(XXX)]  


while True:  
    for thread in WorkerList1:  
         thread.run (start? join? or?)
    for thread in WorkerList2:  
          thread.run (start? join? or?)  
    for thread in WorkerList3:  
          thread.run (start? join? or?)  
    do sth  .

我试图让所有WorkerList中的所有线程同时开始运行,或者至少在同一时间开始运行。一旦它们全部终止,我想再次调用所有线程。

如果没有循环,我可以使用.start;但由于我只能开始一次线程,所以开始显然不适合这里。如果我使用run,似乎所有线程都按顺序启动,不仅是同一列表中的线程,还有来自不同列表的线程。

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:11)

这里有很多误解:

  • 您只能启动一次线程的特定实例。但在你的情况下,for循环遍历一个线程的不同实例,每个实例被分配给循环中的变量thread,所以在调用start()方法时完全没有问题每个线程。 (您可以将其视为变量thread是列表中实例化的Thread()对象的别名)

  • run()join()不同:调用run()就像按顺序编程一样执行。 run()方法不会启动新线程,它只是执行方法中的语句,就像任何其他函数调用一样。

  • join()没有开始执行任何操作:它只等待一个线程完成。为了使join()能够正常运行一个线程,您必须先在此线程上调用start()

另外,您应该注意,一旦完成执行,您就无法重新启动线程:您必须重新创建线程对象才能再次启动它。要使其正常工作的一种解决方法是在Thread.__init__()方法的末尾调用run()。但是,我不建议这样做,因为这将禁止使用join()方法来检测线程的执行结束。

答案 1 :(得分:2)

如果你在循环中调用thread.start() 实际上只会启动每个线程一次,因为列表中的所有条目都是不同的线程对象(它们属于什么并不重要)到同一个班级)。您永远不应该直接调用线程的run()方法 - 它应该由start()方法调用。直接调用它不会在单独的线程中调用它。

答案 2 :(得分:1)

我遇到了同样的困境,并提出了这个对我来说非常有效的解决方案。它还允许有效地使用线程杀死装饰器。

关键功能是使用在[{1}}中实例化并.start编辑的线程刷新器。这个线程刷新线程将运行一个实例化并启动所有其他(真实的,任务执行的)线程的函数。使用线程杀手装饰线程刷新功能允许您在满足某个条件时终止所有线程,例如main终止。

main

答案 3 :(得分:1)

下面的代码创建的类只是一个线程,但只是一个线程,并再次调用Thread类的初始化,以便线程不知道它已被调用。

from threading import Thread
class MTThread(Thread):
    def __init__(self, name = "", target = None):
        self.mt_name = name
        self.mt_target = target
        Thread.__init__(self, name = name, target = target)
    def start(self):
        super().start()
        Thread.__init__(self, name = self.mt_name, target = self.mt_target)
    def run(self):
        super().run()
        Thread.__init__(self, name = self.mt_name, target = self.mt_target)
def code():
    #Some code
thread = MTThread(name = "SomeThread", target = code)
thread.start()
thread.start()

答案 4 :(得分:0)

from threading import Thread
from time import sleep
def runA():
    while a==1:
        print('A\n')
        sleep(0.5)

if __name__ == "__main__":
    a=1
    t1 = Thread(target = runA)
    t1.setDaemon(True)
    t1.start()
    sleep(2)
    a=0
    print(" now def runA stops")
    sleep(3)
    print("and now def runA continue")
    a=1
    t1 = Thread(target = runA)
    t1.start()
    sleep(2)