从外部停止循环的最佳方法是什么?
What is the best way to stop a loop from outside it?
我有一个 python 打印微调器的脚本。希望这个微调器能持续到停止。
spinnerFrames = [
"/",
"-",
"\",
"|",
]
def spinner():
i = 0
while True:
clearScreen() #function to clear the screen
print(spinnerFrames[i])
i = i + 1
if (i == 3):
i = 0
sleep(0.15)
spinner()
sleep(3)
# break out here
print("Done!")
我知道您可以 sys.stdout.write()
然后只删除该行,但这不是重点。
我想不出停止循环并退出函数的最佳方法。 (继续我的代码)我希望能够从你调用它的地方打破循环,因为我希望把它做成一个 Pip 包。
我认为这是可能的,尽管我不知道该怎么做。感谢您的帮助!
您需要 运行 它是异步的,就像多处理库允许您做的那样。当你创建一个单独的线程时,你会在它上面留下一个句柄,你可以在你想要它停止时使用它来杀死它。
from multiprocessing import Process
from time import sleep
spinnerFrames = [
"/",
"-",
"\",
"|",
]
def spinner():
i = 0
while True:
print(spinnerFrames[i], end='\r')
i = i + 1
if (i == 3):
i = 0
sleep(0.15)
if __name__ == '__main__':
p = Process(target=spinner)
p.start()
sleep(3)
p.terminate()
print("Done!")
记录开始时间,如果当前时间 - 开始时间 > 则中断循环
持续时间。
import time
spinnerFrames = [
"/",
"-",
"\",
"|",
]
def spinner():
i = 0
startTime = time.time()# record starting time
duration = 3
while True:
clearScreen() #function to clear the screen
print(spinnerFrames[i])
i = i + 1
if (i == 3):
i = 0
if time.time() - startTime > duration:
break
sleep(0.15)
spinner()
print("Done!")
这是我的一个项目的参考实现。它打印点而不是微调器,但更改起来很简单:
import threading
import time
def indicate_wait(func):
active = threading.Lock()
def dot_printer():
while active.locked():
print('.', end='', flush=True)
time.sleep(1)
def wrapper(*args, **kwargs):
t = threading.Thread(target=dot_printer)
active.acquire()
t.start()
res = func(*args, **kwargs)
active.release()
return res
return wrapper
示例:
@indicate_wait
def test():
time.sleep(5)
我有一个 python 打印微调器的脚本。希望这个微调器能持续到停止。
spinnerFrames = [
"/",
"-",
"\",
"|",
]
def spinner():
i = 0
while True:
clearScreen() #function to clear the screen
print(spinnerFrames[i])
i = i + 1
if (i == 3):
i = 0
sleep(0.15)
spinner()
sleep(3)
# break out here
print("Done!")
我知道您可以 sys.stdout.write()
然后只删除该行,但这不是重点。
我想不出停止循环并退出函数的最佳方法。 (继续我的代码)我希望能够从你调用它的地方打破循环,因为我希望把它做成一个 Pip 包。
我认为这是可能的,尽管我不知道该怎么做。感谢您的帮助!
您需要 运行 它是异步的,就像多处理库允许您做的那样。当你创建一个单独的线程时,你会在它上面留下一个句柄,你可以在你想要它停止时使用它来杀死它。
from multiprocessing import Process
from time import sleep
spinnerFrames = [
"/",
"-",
"\",
"|",
]
def spinner():
i = 0
while True:
print(spinnerFrames[i], end='\r')
i = i + 1
if (i == 3):
i = 0
sleep(0.15)
if __name__ == '__main__':
p = Process(target=spinner)
p.start()
sleep(3)
p.terminate()
print("Done!")
记录开始时间,如果当前时间 - 开始时间 > 则中断循环 持续时间。
import time
spinnerFrames = [
"/",
"-",
"\",
"|",
]
def spinner():
i = 0
startTime = time.time()# record starting time
duration = 3
while True:
clearScreen() #function to clear the screen
print(spinnerFrames[i])
i = i + 1
if (i == 3):
i = 0
if time.time() - startTime > duration:
break
sleep(0.15)
spinner()
print("Done!")
这是我的一个项目的参考实现。它打印点而不是微调器,但更改起来很简单:
import threading
import time
def indicate_wait(func):
active = threading.Lock()
def dot_printer():
while active.locked():
print('.', end='', flush=True)
time.sleep(1)
def wrapper(*args, **kwargs):
t = threading.Thread(target=dot_printer)
active.acquire()
t.start()
res = func(*args, **kwargs)
active.release()
return res
return wrapper
示例:
@indicate_wait
def test():
time.sleep(5)