我想知道我是否可以在
Python类的方法中运行while循环,可以从另一个方法停止.
例如,像这样:
from time import sleep
class example():
global recording
def __init__(self):
pass
def start(self):
global recording
recording = True
while recording:
print(1)
def stop(self):
global recording
recording = False
print("SLEEEPINGGGGGGGGGGG")
a = example()
a.start()
sleep(0.5)
a.stop()
但是,它不起作用,循环不会停止.
编辑
由于我不想在课外创建一个Thread,我只是尝试了这个,但它也不起作用.
from time import sleep
import threading
class example():
def __init__(self):
self.is_running = False
def start(self):
self.is_running = True
self.loop_thread = threading.Thread(target=self.main_loop)
def main_loop(self):
while self.is_running:
sleep(0.5)
print(1)
def stop(self):
self.is_running = False
print("SLEEEPINGGGGGGGGGGG")
a = example()
a.start()
sleep(3)
a.stop()
最佳答案 a.start()是一个无限循环.由于没有任何东西同时运行,它只是运行并且永远不会到达下一个语句.
你需要创建一个这样的线程
import time,threading
class example():
def __init__(self):
self.__recording = False
def start(self):
self.__recording = True
while self.__recording:
time.sleep(1)
print(1)
def stop(self):
self.__recording = False
a = example()
t = threading.Thread(target=a.start)
t.start()
time.sleep(5)
a.stop()
t.join()
请注意,我使用的是成员变量而不是全局变量.当start方法看到变量为True时,它退出循环.任务完成.
这是有效的,因为我正在使用sleep().如果您正在运行纯python CPU密集型作业,由于python GIL将无法工作
正如评论中所建议的那样,您可以更进一步,继承自threading.Thread方法:
import time,threading
class example(threading.Thread):
def __init__(self):
threading.Thread.__init__(self,target=self.run)
self.__recording = False
def run(self):
self.__recording = True
while self.__recording:
time.sleep(1)
print(1)
def join(self):
self.__recording = False
threading.Thread.join(self)
a = example()
a.start()
time.sleep(5)
a.join()
请注意,stop方法现在被join替换,这表示记录线程停止然后调用父连接方法.所以当你加入时,你首先自动停止循环.