gpt4 book ai didi

python - 奇怪的线程行为

转载 作者:太空宇宙 更新时间:2023-11-04 10:57:17 25 4
gpt4 key购买 nike

我是 python 的新手,但不是多线程软件的新手,所以我无法解释我所看到的特定行为。我的程序非常简单:我监视 linux 命令“iostat”的输出并在某些情况下做一些事情。我的代码如下:

class SysMonitor(threading.Thread):

def __init__(self):
threading.Thread.__init__(self)
self.isStopping = False
self.ioprocess = []

def run(self):
self.ioprocess = subprocess.Popen(['/usr/bin/iostat', '-p', 'sda', '60'], stdout=subprocess.PIPE)
p = self.ioprocess
i = 0

# Discard first output
while (i < 11):
p.stdout.readline()
i = i + 1

# Now keep on waiting on new output from iostat and then process it when it comes in
while (not self.isStopping):
select.select([p.stdout], [], [])

# Don't process the last output if we are stopping
if (self.isStopping):
print 'Quitting, discarding last buffer:' + str(self.isStopping)
continue

# do some p.stdout.readline() and process the data

def stop(self):
self.isStopping = True
self.ioprocess.terminate()

我不明白的是,当我调用'stop'函数时,程序有时会崩溃,因为select被释放了,因为EOF被写入stdout缓冲区,但isStopping仍然是False。这怎么会发生?

最佳答案

如果 stop() 在线程外调用,它可能会导致随机问题是的。因为当您调用 stop() 时,线程可能处于打印或选择等状态。

只需将 terminate() 移动到 run() 方法的末尾。然后将 isStopping 设置为 True 将正确地离开循环,然后终止进程。

如果你想等待它,你可以加入线程:

def stop(self):
self.isStopping = True
self.join()

关于python - 奇怪的线程行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8763385/

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