我是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()
答案 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)
希望您喜欢它!