如何在Python脚本中设置时间延迟?


当前回答

如何在Python中设置时间延迟?

在一个线程中,我建议使用睡眠功能:

>>> from time import sleep

>>> sleep(4)

该函数实际上暂停了操作系统调用它的线程的处理,允许其他线程和进程在休眠时执行。

为此目的使用它,或者简单地延迟函数的执行。例如:

>>> def party_time():
...     print('hooray!')
...
>>> sleep(3); party_time()
hooray!

“万岁!”在我按下Enter键3秒后打印。

对多个线程和进程使用睡眠的示例

同样,睡眠会暂停线程-它使用几乎为零的处理能力。

为了演示,创建一个这样的脚本(我第一次在交互式Python 3.5 shell中尝试,但由于某些原因,子进程找不到party_later函数):

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor, as_completed
from time import sleep, time

def party_later(kind='', n=''):
    sleep(3)
    return kind + n + ' party time!: ' + __name__

def main():
    with ProcessPoolExecutor() as proc_executor:
        with ThreadPoolExecutor() as thread_executor:
            start_time = time()
            proc_future1 = proc_executor.submit(party_later, kind='proc', n='1')
            proc_future2 = proc_executor.submit(party_later, kind='proc', n='2')
            thread_future1 = thread_executor.submit(party_later, kind='thread', n='1')
            thread_future2 = thread_executor.submit(party_later, kind='thread', n='2')
            for f in as_completed([
              proc_future1, proc_future2, thread_future1, thread_future2,]):
                print(f.result())
            end_time = time()
    print('total time to execute four 3-sec functions:', end_time - start_time)

if __name__ == '__main__':
    main()

此脚本的输出示例:

thread1 party time!: __main__
thread2 party time!: __main__
proc1 party time!: __mp_main__
proc2 party time!: __mp_main__
total time to execute four 3-sec functions: 3.4519670009613037

多线程

您可以使用Timer线程对象触发稍后在单独线程中调用的函数:

>>> from threading import Timer
>>> t = Timer(3, party_time, args=None, kwargs=None)
>>> t.start()
>>>
>>> hooray!

>>>

空行说明了函数打印到我的标准输出中,我必须按Enter键以确保出现提示。

这种方法的好处是,当Timer线程在等待时,我可以做其他事情,在本例中,在执行函数之前按一下Enter键(见第一个空提示)。

多处理库中没有相应的对象。你可以创建一个,但它可能是没有原因的。对于一个简单的计时器来说,子线程比一个全新的子进程更有意义。

其他回答

延迟是通过时间库完成的,特别是time.sleep()函数。

让它等待一秒钟:

from time import sleep
sleep(1)

这之所以有效,是因为通过执行以下操作:

from time import sleep

你只从时间库中提取睡眠函数,这意味着你只需要调用它:

sleep(seconds)

而不是必须键入

time.sleep()

打字的时间太长了。

使用此方法,您将无法访问时间库的其他功能,也无法使用名为sleep的变量。但您可以创建一个名为time的变量。

如果您只需要模块的某些部分,那么从[library]导入[function](,[function2])非常有用。

你也可以这样做:

import time
time.sleep(1)

只要输入time,就可以访问时间库的其他功能,如time.clock()。[function](),但无法创建变量time,因为它会覆盖导入。要做的解决方案

import time as t

这将允许您将时间库引用为t,允许您执行以下操作:

t.sleep()

这适用于任何库。

Python标准库中的Tkinter库是一个可以导入的交互式工具。基本上,您可以创建按钮、框、弹出窗口和显示为窗口的东西,并使用代码进行操作。

如果使用Tkinter,请不要使用time.sleep(),因为它会破坏程序。这种情况发生在我身上。相反,使用root.after()并用毫秒来替换多少秒的值。例如,time.sleep(1)相当于Tkinter中的root.after(1000)。

否则,许多答案都指出了time.sleep(),这才是正确的方法。

这是一个简单的时间延迟示例:

import time

def delay(period='5'):
    # If the user enters nothing, it'll wait 5 seconds
    try:
        # If the user not enters a int, I'll just return ''
        time.sleep(period)
    except:
        return ''

另一个,在Tkinter:

import tkinter

def tick():
    pass

root = Tk()
delay = 100 # Time in milliseconds
root.after(delay, tick)
root.mainloop()

如果要在Python脚本中设置时间延迟:

使用time.sleep或Event()。像这样等待:

from threading import Event
from time import sleep

delay_in_sec = 2

# Use time.sleep like this
sleep(delay_in_sec)         # Returns None
print(f'slept for {delay_in_sec} seconds')

# Or use Event().wait like this
Event().wait(delay_in_sec)  # Returns False
print(f'waited for {delay_in_sec} seconds')

但是,如果要延迟函数的执行,请执行以下操作:

使用线程。计时器如下:

from threading import Timer

delay_in_sec = 2

def hello(delay_in_sec):
    print(f'function called after {delay_in_sec} seconds')

t = Timer(delay_in_sec, hello, [delay_in_sec])  # Hello function will be called 2 seconds later with [delay_in_sec] as the *args parameter
t.start()  # Returns None
print("Started")

输出:

Started
function called after 2 seconds

为什么使用后一种方法?

它不会停止整个脚本的执行(传递给它的函数除外)。启动计时器后,还可以通过执行timer_obj.cancel()来停止计时器。

我知道有五种方法:time.sleep()、pygame.time.wait()、matplotlib的pyplot.pause()、.after()和asyncio.sleep)。


time.sleep()示例(如果使用tkinter,则不要使用):

import time
print('Hello')
time.sleep(5) # Number of seconds
print('Bye')

pygame.time.wait()示例(如果不使用pygame窗口,则不建议使用,但可以立即退出窗口):

import pygame
# If you are going to use the time module
# don't do "from pygame import *"
pygame.init()
print('Hello')
pygame.time.wait(5000) # Milliseconds
print('Bye')

matplotlib的函数pyplot.pause()示例(如果不使用图形,则不建议使用,但可以立即退出图形):

import matplotlib
print('Hello')
matplotlib.pyplot.pause(5) # Seconds
print('Bye')

after()方法(最好使用Tkinter):

import tkinter as tk # Tkinter for Python 2
root = tk.Tk()
print('Hello')
def ohhi():
    print('Oh, hi!')
root.after(5000, ohhi) # Milliseconds and then a function
print('Bye')

最后,asyncio.sleep()方法(必须在异步循环中):

await asyncio.sleep(5)