gpt4 book ai didi

python - 线程脚本在未关闭的情况下结束后停止

转载 作者:行者123 更新时间:2023-11-28 17:50:45 27 4
gpt4 key购买 nike

希望这只是我做错的一些小事,因为这些是我使用队列的第一个线程脚本。基本上在跑完它之后会停下来,但不会退出。

import threading
import Queue
class Words(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.queue = Queue.Queue()

def word(self):
read = open('words.txt')
for word in read:
word = word.replace("\n","")
self.queue.put(word)
read.close()
for i in range(5):
t = self.run()
t.setDaemon(True)
t.start()
self.queue.join()

def run(self):
while True:
word = self.queue.get()
print word
self.queue.task_done()

if __name__ == '__main__':
Word = Words()
Word.word()

最佳答案

您在代码中以多种方式错误地使用了线程:

首先,代码似乎是建立在错误的假设之上的,即您拥有的一个 Thread 子类对象可以生成完成工作所需的所有线程。相反,Thread documentation表示 start “每个 Thread 对象最多只能调用一次”。对于 word 方法,这是 self 引用。

但是,调用 self.start() 是没有用的,因为这会产生一个线程来使用队列,而您不会从线程中获得任何好处。由于 word 无论如何都必须构造新的 Words 实例以启动多个线程,并且队列对象将需要被多个 Words 实例访问,将它们与 Words 对象分开会很有用。例如,word 可以是 Words 对象之外的函数,其开头如下:

def word():
queue = Queue.Queue()
read = open('words.txt')
for word in read:
word = word.replace("\n","")
self.put(word)
read.close()
#...

这也意味着 Words 必须将队列对象作为参数,以便多个实例共享同一个队列:

class Words(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue

其次,您的线程函数 (run) 是一个无限循环,因此线程永远不会终止。由于您仅在将所有项目添加到队列后才运行队列使用者线程,因此一旦队列为空,终止线程应该没有问题,如下所示:

def run(self): 
while True:
try:
word = self.queue.get(False)
except Queue.Empty:
break
print word
self.queue.task_done()

在这里使用异常是很有用的,否则队列可能会清空,然后线程可能会尝试从中获取,最终它会永远等待添加一个项目。

第三,在您的 for 循环中调用 self.run(),它将控制传递给 run 方法,该方法然后处理整个队列并返回 None 方法更改后终止。以下行将引发异常,因为 t 将被分配值 None。因为你想产生其他线程来完成这项工作,你应该做 t = Word(queue) 来获得一个新的单词线程,然后 t.start() 开始.所以,放在一起的代码应该是

class Words(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue

def run(self):
while True:
try:
word = self.queue.get(False)
except Queue.Empty:
break
print word
self.queue.task_done()

def word():
queue = Queue.Queue()
read = open('words.txt')
for word in read:
word = word.replace("\n","")
self.put(word)
read.close()
for i in range(5):
t = Word()
t.setDaemon(True)
t.start()
queue.join()

if __name__=='__main__':
word()

关于python - 线程脚本在未关闭的情况下结束后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10605368/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com