Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 阻止外部循环的最佳方法是什么?_Python_Python 3.x_Loops_Break - Fatal编程技术网

Python 阻止外部循环的最佳方法是什么?

Python 阻止外部循环的最佳方法是什么?,python,python-3.x,loops,break,Python,Python 3.x,Loops,Break,我有一个打印微调器的python脚本。这个旋转器有望一直持续到停止 喷丝板框架=[ "/", "-", "\\", "|", ] def微调器(): i=0 尽管如此: clearScreen()#用于清除屏幕的函数 打印(喷丝板框架[i]) i=i+1 如果(i==3): i=0 睡眠(0.15) 微调器() 睡眠(3) #在这里爆发 打印(“完成!”) 我知道你可以做sys.stdout.write(),然后只删除那一行,但这不是重点 我想不出停止循环并退出函数的最佳方法。(在我的代码中继

我有一个打印微调器的python脚本。这个旋转器有望一直持续到停止

喷丝板框架=[
"/",
"-",
"\\",
"|",
]
def微调器():
i=0
尽管如此:
clearScreen()#用于清除屏幕的函数
打印(喷丝板框架[i])
i=i+1
如果(i==3):
i=0
睡眠(0.15)
微调器()
睡眠(3)
#在这里爆发
打印(“完成!”)
我知道你可以做
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) 

你不能。当您执行
sleep(0.15)
时,解释器将在
spinner()函数中休眠。您应该在循环内部检查是否满足条件(例如,您等待的任何操作都已完成),然后在满足条件时中断。在循环完成且函数返回到当前设置之前,您的代码永远不会到达“在此中断”部分,如果希望在执行其余代码时将微调器作为另一个进程运行,则需要查看多进程这更多的是注释而不是答案。我建议将其添加为问题的注释,或者编写一个示例作为答案进行解释。如何异步运行它?我可以。谢谢你让我知道。我对这整件事还不熟悉,所以我仍然习惯于答案应该是什么样子。@RevelveCarlbergwest这是python异步的一个很好的起点-@superbrain不确定他们不需要包含代码。我可以这样做,但我只想在我想的时候爆发,而不是持续时间。微调器持续到某个加载完成的时间点不是设定的时间量。