【问题标题】:Python - Never-ending time.sleep(1) - Possible to end it?Python - 永无止境的 time.sleep(1) - 可以结束它吗?
【发布时间】:2018-03-08 23:45:47
【问题描述】:

所以我一直在调整日程安排,终于让它发挥作用。我太兴奋了,无法意识到还有另一个问题哈哈。但是现在的问题是,只要主体完成,它就不会结束,我真的找不到解决方案。我知道问题出在 Time.sleep(1) 行上,因为每当我使用keyboardInterrput 时都会出现错误提示 Time.sleep(1) 是 "Issue" 并且我真的找不到解决办法来结束它。

我正在使用来自 github 的时间表:Github schedule

while True:
    UserInput = input('To run Schedule task - Press y\nTo run directly - Press n\n')

    if(UserInput == 'y' or UserInput == 'Y'):
        print(Fore.RESET + space)
        TimeUser = input('What time to start script? Format - HH:MM\n')

        schedule.every().day.at(TimeUser).do(main)
        wipe()
        print('Schedule starts at: ''' + TimeUser + ' - Waiting for time...')
        idle = int(round(schedule.idle_seconds()))



        while True:
            schedule.run_pending()
            time.sleep(1)
            idle = int(round(schedule.idle_seconds()))
            if(idle < 6.0) and (idle >= 0.0):
                print('Starting in: ' + str(idle))

    elif(UserInput == 'n' or UserInput == 'N'):
        main()


    print("Wrong input - Try again")

【问题讨论】:

  • while True: 意味着永远重复 - 这就是它正在做的事情。你可以使用break 来逃避它
  • 非常正确。我试图在 While 内的 if 语句之后休息一下,但是打印不会继续。我也在 While 语句之后尝试了一些东西。所以我的结构有些问题。
  • @Stael 调度库需要那个繁忙的循环。这里真正的问题是 OP 如何在不阻塞的情况下运行那个繁忙的循环,该库文档中的答案是:run it in another thread。如果他中断,计划任务将无法完成。
  • 哦该死的。你发现了一些非常好的东西@PauloScardine 你可能有我的解决方案吗?
  • 我愿意,但我现在没有时间发布完整的答案。如果没有人先发布一个像样的答案,那么今晚我会在塞进我的男孩后看看......

标签: python multithreading scheduled-tasks deadlock sleep


【解决方案1】:

您可以使用for 关键字。 for 语句可以定义您的迭代和停止条件。或者使用range() 函数来迭代你的数字序列。

习惯于传统的 if-then-else 语句,break 语句将使您脱离 while 循环。它需要与您最里面的forwhile 循环一起使用。您的 else 子句需要属于您的 for 循环,而不是 if 语句的一部分。 continue 语句将使您的循环向前移动。

这里有例子:https://docs.python.org/3/tutorial/controlflow.html

【讨论】:

    【解决方案2】:

    您的代码被封装在while 循环中,true 作为参数。要么你做错了,要么这是糟糕的结构。这就是问题所在。

    如果您不想删除 while 循环,那么至少在某处添加 break

    如果您在构建代码时需要帮助,请转至Code Review.

    【讨论】:

    • 哦,谢谢!我会检查代码审查。我想这就是我现在应该去的地方哈哈。谢谢拉斯!
    • @WeInThis 没问题。
    • 这个答案中的一切都是真的,但它也可以适合评论。
    • @PauloScardine 你是什么意思?
    • 我一直都错了,所以让我们检查一下事实:OP 正在使用的调度库需要那个繁忙的循环。如果你打破了,你将永远无法完成预定的任务。一个好的答案是繁忙循环在另一个线程中运行,因此程序不会阻塞。
    猜你喜欢
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 2020-03-14
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多