python Thread.name打印最后一个线程创建的名称

时间:2019-06-24 15:14:06

标签: python multithreading

我是Python的新手,正在学习线程。我创建了一个示例生产者-消费者代码,在其中将影片添加到生产者线程中的列表中,并从 Consumer 线程中的同一列表中弹出前元素。问题是在打印影片列表的项目以及线程名称时,我在 Producer 线程中得到的线程名称不正确。这是我的代码

Producer.py

from threading import Thread
from threading import RLock
import time


class Producer(Thread):
    def __init__(self):
        Thread.__init__(self)
        Thread.name = 'Producer'

        self.movieList = list()
        self.movieListLock = RLock()


    def printMovieList(self):
        self.movieListLock.acquire()

        if len(self.movieList) > 0:
            for movie in self.movieList:
                print(Thread.name, movie)

            print('\n')

        self.movieListLock.release()


    def pushMovieToList(self, movie):
        self.movieListLock.acquire()

        self.movieList.append(movie)
        self.printMovieList()

        self.movieListLock.release()


    def run(self):
        for i in range(6):
            self.pushMovieToList('Avengers' + str(i + 1))
            time.sleep(1)

Consumer.py

from threading import Thread
import time


class Consumer(Thread):

    def __init__(self):
        Thread.__init__(self)
        Thread.name = 'Consumer'

        self.objProducer = None


    def popMovieFromList(self):
        self.objProducer.movieListLock.acquire()

        if len(self.objProducer.movieList) > 0:
            movie = self.objProducer.movieList.pop(0)
            print(Thread.name, ':', movie)
            print('\n')

        self.objProducer.movieListLock.release()


    def run(self):
        while True:
            time.sleep(1)
            self.popMovieFromList()

Main.py

from Producer import *
from Consumer import *


def main():
    objProducer = Producer()
    objConsumer = Consumer()

    objConsumer.objProducer = objProducer

    objProducer.start()
    objConsumer.start()

    objProducer.join()
    objConsumer.join()


main()

1 个答案:

答案 0 :(得分:0)

我不确定您是否解决了这个问题。
希望我的回答会有所帮助。
您可以检查穿线文档。

Here它表示Thread.name可以为多个线程设置相同的名称。

名称
仅用于标识目的的字符串。它没有语义。多个线程可以被赋予相同的名称。初始名称由构造函数设置。

我认为Thread.name是一个静态变量,因此它共享不同的线程。 如果要设置线程名称,可以在线程对象中设置它,如下所示:

class Producer(Thread):
def __init__(self):
    Thread.__init__(self)
    self.name= 'Producer'

并通过threading.current_thread()。name进行获取。

if len(self.movieList) > 0:
    for movie in self.movieList:
    print(threading.current_thread().name, movie)

希望您喜欢它!