13 Pytanie: Jak mogę opóźnić czas w Pythonie?

pytanie utworzone w Mon, Jun 11, 2018 12:00 AM

Chciałbym wiedzieć, jak umieścić opóźnienie czasowe w skrypcie Pythona.

    
2510
  1. Możliwy duplikat 2019-04-16 16: 46: 30Z
13 odpowiedzi                              13                         
import time
time.sleep(5)   # Delays for 5 seconds. You can also use a float value.

Oto kolejny przykład, w którym coś jest uruchamiane mniej więcej raz na minutę:

import time
while True:
    print("This prints once a minute.")
    time.sleep(60) # Delay for 1 minute (60 seconds).
    
2742
2018-06-14 21: 04: 58Z
  1. jeśli potrzebujesz spełnienia pewnych warunków. Lepiej jest używać threading.Event.wait.
    2014-04-25 08: 14: 32Z
  2. Cóż ... będzie drukować rzadziej niż to, ponieważ drukowanie i obsługa wszystkich buforów, które się z tym wiąże, zajmuje trochę czasu (prawdopodobnie wykonanie przełącznika kontekstowego jądra), i zarejestrować sygnał alarmowy, ale ... tak. Trochę mniej niż raz na minutę.
    2015-06-17 19: 29: 46Z
  3. podczas używania tkinter jako graficznego interfejsu użytkownika, sleep () nie wykona zadania - zamiast tego użyj after (): tkinter.Tk.after (yourrootwindow, 60000) lub yourrootwindow.after(60000)
    2017-08-03 10: 41: 35Z
  4. Warto wspomnieć, że w systemie Windows najlepszą ziarnistością, na którą możesz liczyć, jest dokładność około 0,015 sekundy (15 ms). Większość wersji Linuksa na nowoczesnych procesorach może uzyskać granulację do 0,001 sekundy (1 ms).
    2018-03-31 00: 07: 36Z
  5. Rzeczywiście. Komentarz tkinter byłby lepiej przedstawiony jako odpowiedź zamiast w komentarzu. Budujemy tutaj bazę danych, która będzie dostępna przez wiele lat, z ludźmi znajdującymi odpowiedzi za pośrednictwem Google, a wiele osób nigdy nie obejrzy komentarzy. To nawet wielkie pytanie. Coś w rodzaju „Jak zrobić opóźnienie czasowe w Pythonie podczas używania tkinter” lub podobnego.
    2018-04-10 15: 29: 46Z

Możesz użyć sleep() funkcji w module time . Może przyjąć argument float dla rozdzielczości sub-sekundy.

from time import sleep
sleep(0.1) # Time in seconds
    
699
2019-05-21 23: 03: 05Z
  

Jak mogę opóźnić czas w Pythonie?

W jednym wątku proponuję funkcję uśpienia :

>>> from time import sleep

>>> sleep(4)

Ta funkcja faktycznie zawiesza przetwarzanie wątku, w którym jest wywoływana przez system operacyjny, umożliwiając wykonywanie innych wątków i procesów podczas uśpienia.

Użyj go w tym celu lub po prostu opóźnij wykonanie funkcji. Na przykład:

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

„hooray!” jest drukowane 3 sekundy po naciśnięciu Enter .

Przykład użycia sleep z wieloma wątkami i procesami

Ponownie, sleep suspokaja twój wątek - używa prawie zerowej mocy obliczeniowej.

Aby zademonstrować, utwórz taki skrypt (najpierw próbowałem tego w interaktywnej powłoce Pythona 3.5, ale podprocesy z jakiegoś powodu nie mogą znaleźć funkcji 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()

Przykładowy wynik tego skryptu:

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

Wielowątkowość

Możesz wyzwolić funkcję, która zostanie później wywołana w oddzielnym wątku za pomocą Timer wątek obiekt:

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

>>> 

Pusta linia pokazuje, że funkcja wydrukowana na moim standardowym wyjściu i musiałem nacisnąć Enter , aby upewnić się, że byłem w trybie zachęty.

Plusem tej metody jest to, że podczas gdy wątek Timer czekał, mogłem zrobić inne rzeczy, w tym przypadku, naciskając Enter jeden raz - przed wykonaniem funkcji (zobacz pierwszy pusty podpowiedź).

Nie ma odpowiedniego obiektu w bibliotece wieloprocesorowej . Możesz go utworzyć, ale prawdopodobnie nie istnieje z jakiegoś powodu. Pod wątek ma o wiele więcej sensu w przypadku prostego timera niż cały nowy podproces.

    
71
2019-03-05 14: 27: 24Z

Trochę zabawy ze śpiącym generatorem .

Pytanie dotyczy opóźnienia czasowego. Może to być ustalony czas, ale w niektórych przypadkach możemy potrzebować opóźnienia mierzonego od ostatniego razu. Oto jedno z możliwych rozwiązań:

Opóźnienie mierzone od ostatniego razu (budzenie się regularnie)

Sytuacja może się zdarzyć, że chcemy robić coś tak regularnie, jak to możliwe i nie chcemy zawracać sobie głowy wszystkimi sprawami last_time, next_time wokół naszego kodu.

Generator buzzerów

Poniższy kod ( sleepy.py ) definiuje generator buzzergen:

import time
from itertools import count

def buzzergen(period):
    nexttime = time.time() + period
    for i in count():
        now = time.time()
        tosleep = nexttime - now
        if tosleep > 0:
            time.sleep(tosleep)
            nexttime += period
        else:
            nexttime = now + period
        yield i, nexttime

Wywoływanie zwykłego buzzergena

from sleepy import buzzergen
import time
buzzer = buzzergen(3) # Planning to wake up each 3 seconds
print time.time()
buzzer.next()
print time.time()
time.sleep(2)
buzzer.next()
print time.time()
time.sleep(5) # Sleeping a bit longer than usually
buzzer.next()
print time.time()
buzzer.next()
print time.time()

I uruchamiając go widzimy:

1400102636.46
1400102639.46
1400102642.46
1400102647.47
1400102650.47

Możemy również użyć go bezpośrednio w pętli:

import random
for ring in buzzergen(3):
    print "now", time.time()
    print "ring", ring
    time.sleep(random.choice([0, 2, 4, 6]))

I uruchamiając go możemy zobaczyć:

now 1400102751.46
ring (0, 1400102754.461676)
now 1400102754.46
ring (1, 1400102757.461676)
now 1400102757.46
ring (2, 1400102760.461676)
now 1400102760.46
ring (3, 1400102763.461676)
now 1400102766.47
ring (4, 1400102769.47115)
now 1400102769.47
ring (5, 1400102772.47115)
now 1400102772.47
ring (6, 1400102775.47115)
now 1400102775.47
ring (7, 1400102778.47115)

Jak widzimy, ten brzęczyk nie jest zbyt sztywny i pozwala nam nadrobić zaległości w regularnych odstępach czasu, nawet jeśli śpimy i wychodzimy poza regularny harmonogram.

    
48
2018-06-15 03: 56: 53Z

Biblioteka tkinter w standardowej bibliotece Pythona to interaktywne narzędzie, które można importować. Zasadniczo możesz tworzyć przyciski i pola oraz wyskakujące okienka i rzeczy, które pojawiają się jako okna, którymi manipulujesz kodem.

Jeśli używasz tkinter, NIE UŻYWAJ TIME.SLEEP(), ponieważ spowoduje to zepsucie programu. To mi się przydarzyło. Zamiast tego użyj root.after() i zastąp wartości na wiele sekund, z milisekundami. Np. time.sleep(1) jest odpowiednikiem root.after(1000) w tkinter.

W przeciwnym razie time.sleep(), na które wskazało wiele odpowiedzi, co jest dobrym rozwiązaniem.

    
26
2017-12-10 13: 18: 21Z

Opóźnienia są realizowane za pomocą biblioteki czasu , a konkretnie time.sleep()

Aby tylko poczekać sekundę:

from time import sleep
sleep(1)

Działa to, ponieważ:

from time import sleep

Wyodrębniasz funkcję uśpienia z biblioteki czasu , co oznacza, że ​​możesz to po prostu nazwać z:

sleep(seconds)

Zamiast wpisywać

time.sleep()

Które jest niezręcznie pisać.

Dzięki tej metodzie nie uzyskasz dostępu do innych funkcji czasu biblioteka i nie możesz mieć zmiennej o nazwie sleep. Ale możesz utworzyć zmienną o nazwie time.

Wykonywanie from [library] import [function] (, [function2]) jest świetne, jeśli tylko chcę pewnych części modułu.

Równie dobrze możesz to zrobić:

import time
time.sleep(1)

i masz dostęp do innych funkcji biblioteki czasu lubisz time.clock() tak długo, jak wpiszesz time.[function](), ale nie możesz nie twórz czasu zmiennego, ponieważ nadpisałby import. Rozwiązanie tego, aby to zrobić

import time as t

, który pozwoli ci odwołać się do biblioteki czasu jako t, zezwalając zrobić:

t.sleep()

Działa to w każdej bibliotece.

    
26
2019-02-02 11: 19: 28Z

Znam 5 metod: time.sleep(), pygame.time.wait(), matplotlib pyplot.pause(), .after() i driver.implicitly_wait().


time.sleep() przykład (nie używaj, jeśli używasz Tkinter):

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

pygame.time.wait() przykład (niezalecane, jeśli nie używasz okna pygame, ale możesz natychmiast zamknąć okno):

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')

funkcja matplotliba pyplot.pause() przykład (niezalecane, jeśli nie używasz wykresu, ale możesz natychmiast opuścić wykres):

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

Metoda .after() (najlepsza w 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')

Wreszcie metoda driver.implicitly_wait() (selen):

driver.implicitly_wait(5)#waits 5 seconds
    
24
2019-02-25 14: 29: 53Z

Opóźnienia można również zaimplementować za pomocą następujących metod.

Pierwsza metoda

import time
time.sleep(5) # Delay for 5 seconds.

Druga metoda opóźnienia polegałaby na użyciu metody niejawnego oczekiwania:

 driver.implicitly_wait(5)

Trzecia metoda jest bardziej przydatna, gdy musisz poczekać, aż określona akcja zostanie zakończona lub dopóki nie zostanie znaleziony element:

self.wait.until(EC.presence_of_element_located((By.ID, 'UserName'))
    
23
2019-06-13 10: 04: 34Z
  1. Druga i trzecia metoda to nie Python per-se, ale związany z selenem. I używałbyś ich, kiedy robisz testy E2E. OP nie wspomniał o żadnym z nich.
    2018-05-05 08: 28: 09Z

asyncio.sleep

Zwróć uwagę w ostatnich wersjach Pythona (python 3.4 lub nowszy) możesz użyć asyncio.sleep . Jest to związane z programowaniem asynchronicznym i asyncio. Sprawdź następny przykład:

import asyncio
from datetime import datetime

@asyncio.coroutine
def countdown(iteration_name, countdown_sec):
    """
    Just count for some countdown_sec seconds and do nothing else
    """
    while countdown_sec > 0:
       print(f'{iteration_name} iterates: {countdown_sec} seconds')
       yield from asyncio.sleep(1)
       countdown_sec -= 1

loop = asyncio.get_event_loop()
tasks = [asyncio.ensure_future(countdown('First Count', 2)),
         asyncio.ensure_future(countdown('Second Count', 3))]

start_time = datetime.utcnow() 

# run both methods. How much time will both run...?
loop.run_until_complete(asyncio.wait(tasks))

loop.close()

print(f'total running time: {datetime.utcnow() - start_time}')

Możemy pomyśleć, że będzie „spać” przez 2 sekundy dla pierwszej metody, a następnie 3 sekundy w drugiej metodzie, łącznie 5 sekund czasu działania tego kodu. Ale .. wydrukuje:

total_running_time: 0:00:03.01286

Polecam przeczytać asyncio oficjalną dokumentację , aby uzyskać więcej informacji

    
7
2018-12-03 19: 32: 42Z

To jest łatweprzykład opóźnienia czasowego:

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 ''

Inny, w Tkinter:

import tkinter

def tick():
    pass

root=Tk()
delay=100 # time in milliseconds
root.after(delay,tick)
root.mainloop()
    
6
2018-09-16 08: 14: 05Z

Podczas gdy wszyscy inni sugerowali moduł de facto time, pomyślałem, że udostępnię inną metodę przy użyciu matplotlib funkcji pyplot, pause .

Przykład

from matplotlib import pyplot as plt
plt.pause(5)    # Pauses the program for 5 seconds

Zazwyczaj jest to używane, aby zapobiec zniknięciu fabuły, gdy tylko zostanie ona wykreślona, ​​lub aby wykonać surowe animacje.

Pozwoli to zaoszczędzić import, jeśli masz już zaimportowane matplotlib.

    
5
2018-06-15 04: 57: 44Z

Jeśli chcesz umieścić opóźnienie czasowe w skrypcie Pythona:

Użyj time.sleep lub Event().wait :

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')       

Jeśli jednak chcesz opóźnić wykonanie funkcji, zrób to:

Użyj threading.Timer tak:

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 sec later with [delay_in_sec] as *args parameter
t.start()  # returns None
print("Started")

Wyjścia:

Started
function called after 2 seconds         

Po co korzystać z późniejszego podejścia?

  • Czy nie zatrzymuje wykonanie całego skryptu. (z wyjątkiem funkcji, którą przekazujesz)
  • Po uruchomieniu zegara możesz go również zatrzymać, wykonując timer_obj.cancel().
5
2019-01-23 05: 41: 03Z

Jeśli masz zainstalowany autopygui, możesz użyć:

#imports
import pyautogui

pyautogui._autoPause(time1)

Całkowity czas pauzy wyniesie time1 sekund

    
0
2019-06-21 05: 12: 23Z
  1. Jakie jest uzasadnienie dla time1 * time2?
    2019-06-18 05: 21: 06Z
  2. może dlatego, że time1 oznacza, ile czasu musisz wstrzymać na czas, a time2 to ile czasu chcesz powtórzyć pauzę. Ale dziwne jest to, że mogą być zarówno pływakami. Na przykład u może mieć 1,5 s pauzy powtarzanej 1,3 razy, co daje całkowity czas pauzy 1,5 * 1,3 s
    2019-06-18 06: 05: 35Z
  3. Ta funkcja jest nieudokumentowane , więc nie będę na nim polegać. Ponadto kod źródłowy jest sprzeczny z logika, którą opisałeś.
    2019-06-18 08: 21: 04Z
  4. oof więc czas pauzy isnt time1 * time2, ale jest if not time2 == 0: sleep(time1)
    2019-06-21 05: 12: 09Z
źródło umieszczone tutaj