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


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


2032
2018-02-04 07:04


pochodzenie




Odpowiedzi:


import time
time.sleep(5)   # Delays for 5 seconds. You can also use a float value.

Oto inny przykład, w którym coś uruchamia się 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).

2262
2018-02-04 07:05



jeśli potrzebujesz pewnych warunków. Lepiej dla użytkownika threading.Event.wait. - ssj
Cóż ... będzie drukować rzadziej niż to, ponieważ zajmuje dużo czasu, aby wydrukować i obsłużyć wszystkie bufory, które się z nim wiążą (być może przełączanie kontekstu jądra) i zarejestrować sygnał alarmu, ale ... tak. Nieco poniżej jednej minuty na minutę. - Parthian Shot
używając tkinter jako graficznego interfejsu użytkownika, sleep () nie wykona zadania - użyj po: (zamiast): tkinter.Tk.after (yourrootwindow, 60000) lub yourrootwindow.after (60000) - DonGru
dzięki za to nie był w stanie zrozumieć, czym jest sen, jeszcze raz dzięki. - harrypotter0
Warto wspomnieć, że w systemie Windows najlepszą ziarnistością, na jaką można liczyć, jest dokładność około 0,015 sekundy (15 ms). Większość wersji Linuksa na nowoczesnych procesorach może osiągnąć do 0,001 sekundy (1 ms) granulacji. - SDsolar


Możesz użyć sleep() funkcja w module czasu. Może przyjąć argument zmiennoprzecinkowy dla rozdzielczości drugiej sekundy.

from time import sleep
sleep(0.1) # Time in seconds.

568
2017-09-15 16:34



Czy istnieje funkcja budzenia? - Elfin forest
@Elfinforest co masz na myśli? - Neil Chowdhury
Tak, ale co można powiedzieć o rzeczywistej rozdzielczości czasowej na różnych platformach? Czy są jakieś gwarancje? Czy rozdzielczość może wynosić 16,666 ms? - Peter Mortensen


Proszę przeczytaj https://web.archive.org/web/20090207081238/http://faqts.com/knowledge_base/view.phtml/aid/2609/fid/378, które mogą Ci pomóc:

Wypróbuj funkcję spania w module czasu.

import time
time.sleep(60)

I włóż to w while pętla i instrukcja będzie wykonywana tylko na   minute ... To pozwala na uruchomienie instrukcji w określonych odstępach czasu   niezależnie od tego, jak długo trwa to polecenie (o ile zajmuje mniej niż   minutę, 5 lub 60 lub cokolwiek, do czego to ustawiłeś) Na przykład, chciałem   uruchamiać ping raz na minutę. Jeśli tylko time.sleep(60) lub time.sleep(45)    nawet, ping nie zawsze zajmuje tyle samo czasu. Tutaj jest   kod :)

time.sleep(time.localtime(time.time())[5])

The [5] po prostu wyciąga sekundy z time.localtime()powrót   wartość.

Wspaniała rzecz time.sleep jest to, że obsługuje zmiennoprzecinkowe   liczby!

import time
time.sleep(0.1) 

http://python.org/doc/current/lib/module-time.html


117
2018-02-04 07:07



time.sleep(time.localtime(time.time())[5]) w ogóle nie ma sensu. To będzie czekać dłużej, jeśli będzie mniej czasu do następnej pełnej minuty. Jeśli chcesz poczekać do końca aktualnej minuty, proponuję: time.sleep(-time.time() % 60) (Działa to również z innymi interwałami) - Stefan Paul Noack


Możesz to zrobić, wykonując następujące czynności:

from time import sleep

# Doing stuff
sleep(0.5) # Sleeping half a second (sleep() uses seconds, but you can also use floats)
# Doing stuff...

54
2018-01-18 18:48



Nic nie dodaje do powyższej odpowiedzi ani powyżej. - Artemis Fowl
w rzeczywistości nie wymaga instalacji pakietu, więc prawdopodobnie powinna zostać oznaczona jako najlepsza odpowiedź - s2t2


Trochę zabawy z sennym generator.

Pytanie dotyczy opóźnienia czasowego. Może to być stały czas, ale w niektórych przypadkach potrzebujemy opóźnienia zmierzonego od ostatniego razu. Oto jedno możliwe rozwiązanie:

Opóźnienie zmierzone od ostatniego czasu (regularne budzenie się)

Sytuacja może być taka, że ​​chcemy robić coś tak regularnie, jak to możliwe i nie chcemy zawracać sobie głowy wszystkimi last_time, next_time wszystko wokół naszego kodu.

Generator brzęczyka

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

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

Wzywając regularne buzzergen

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 to 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 nadążać za regularnymi, sennymi przerwami, nawet jeśli zasypiamy i wydostajemy się z regularnego harmonogramu.


33
2018-05-14 21:30





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

W jednym wątku sugeruję funkcję spania:

>>> from time import sleep

>>> sleep(4)

W rzeczywistości 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 snu.

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

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

"hooray!" wydrukowane 3 sekundy po tym, jak uderzyłem Wchodzić.

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

Jeszcze raz, sleep zawiesza twój wątek - używa przy zerowej mocy przetwarzania.

Aby to zademonstrować, utwórz taki skrypt (pierwszy raz spróbowałem tego w interaktywnej powłoce Python 3.5, ale podprocesy nie mogą znaleźć party_later funkcja z jakiegoś powodu):

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ładowe dane wyjściowe z 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 wywołać funkcję, która będzie wywoływana w późniejszym czasie w osobnym wątku z Timerwątek obiektu:

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

>>> 

Pusta linia pokazuje, że funkcja wydrukowana na moim standardzie i musiałem trafić Wchodzić aby upewnić się, że jestem na bieżąco.

Zaletą tej metody jest to, że podczas Timer wątek czekał, mogłem robić inne rzeczy, w tym przypadku uderzając Wchodzić jeden raz - przed wykonaniem funkcji (patrz pierwszy pusty monit).

W bibliotece wieloprocesowej nie ma odpowiedniego obiektu. Możesz go stworzyć, ale prawdopodobnie nie istnieje z jakiegoś powodu. Podtytuł ma dużo większy sens w przypadku prostego timera niż cały nowy pod-proces.


21
2018-06-21 03:25





Biblioteka tkinter w standardowej bibliotece Python jest interaktywnym narzędziem, które można zaimportować. Zasadniczo możesz tworzyć przyciski i pola oraz wyskakujące okienka i elementy, które wyglądają jak okna, którymi manipulujesz przy pomocy kodu.

Jeśli używasz tkintera, NIE UŻYWAJ TIME.SLEEP() ponieważ to zmiażdży twój program. To mi się przydarzyło. Zamiast tego użyj root.after() i zastępuj wartości przez wiele sekund za pomocą milisekund. Na przykład, time.sleep(1) jest równa root.after(1000) w tkinter.

Inaczej, time.sleep(), które wiele odpowiedzi wskazało, a która jest drogą do zrobienia.


20
2018-02-28 19:45





Opóźnienia mogą być realizowane za pomocą trzech metod.

Zacznijmy od najłatwiejszego:

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

Drugą metodą opóźnienia byłoby użycie niejawnej metody oczekiwania:

 driver.implicitly_wait(5)

Trzecia metoda jest bardziej przydatna, gdy musisz poczekać, aż określone działanie zostanie wykonane lub dopóki nie zostanie znaleziony element:

self.wait.until(EC.presence_of_element_located((By.ID, 'UserName'))

11
2018-01-05 10:41



Druga i trzecia metoda nie są Python per se, ale związane selen. I używałbyś ich, kiedy robisz testy E2E. OP o żadnym z nich nie wspomniał. - alexandernst


Aby wprowadzić opóźnienie, należy zaimportować plik time moduł. Z tym modułem wystarczy tylko napisać:

time.sleep(The amount of time)

Na przykład, jeśli chcesz ustawić opóźnienie o sekundę przed uruchomieniem przez komputer innej linii, powinieneś umieścić:

time.sleep(1)
print('Hello, World!')

To wszystko :)


9
2017-07-04 10:55



Jak ta odpowiedź różni się od pierwszej wysłanej odpowiedzi, prawie 9 lat temu? - Peter Mortensen


Istnieją 4 metody, które znam: time.sleep(), pygame.time.wait(), matplotlib pyplot.pause(), i .after().


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

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 wyjść z tego okna):

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 matplotlib pyplot.pause() przykład (niezalecane, jeśli nie korzystasz z wykresu, ale możesz natychmiast wyjść z wykresu):

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

Wreszcie, .after() metoda (najlepiej z 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')

7
2017-07-05 20:47





Opóźnienia są wykonywane za pomocą biblioteka czasu, w szczególności czas spać() funkcjonować...

Aby po prostu czekać na sekundę:

from time import sleep
sleep(1)

Działa to, ponieważ:

from time import sleep

wyodrębniasz funkcja spania  tylko z biblioteka czasu co oznacza, że ​​możesz po prostu wywołać to za pomocą:

sleep(seconds)

zamiast konieczności pisania

time.sleep()

co jest niezgrabnie długie.

Dzięki tej metodzie nie uzyskasz dostępu do innych funkcji biblioteka czasu i nie możesz mieć zmiennej zwanej snem. Ale możesz stworzyć zmienną zwaną czasem.

Robić od [biblioteka] import [funkcja] (, [funkcja2]) jest świetny, jeśli chcesz tylko niektórych części modułu.

Równie dobrze możesz to zrobić jako

import time
time.sleep(1)

i będziesz miał dostęp do innych funkcji biblioteka czasulubić time.clock() tak długo, jak piszesz czas.funkcja, ale nie można utworzyć zmiennego czasu.


6
2018-06-13 19:04