Ga naar hoofdinhoud

Python-functie time.sleep()

In deze tutorial leer je hoe de functie time.sleep() werkt en hoe je die in je programma toepast.
· 7 min lezen

Verken met AI

In deze tutorial leer je over de Python-functie sleep(), waarmee je een pauze in de uitvoering van je programma kunt inlassen. Dit is een handige functie, vooral wanneer je programma met threads werkt of wanneer je met graphics en animaties bezig bent. De functie sleep is beschikbaar binnen de module time, die nog veel meer functies bevat voor tijdstoegang en tijdconversies. Hoewel deze module op alle platforms beschikbaar is, zijn niet alle functies daarin overal beschikbaar of werken ze precies hetzelfde. Laten we de module time.sleep() eens van dichterbij bekijken...

Time-module

Deze module biedt functies die helpen om met tijd te werken en die in je programma te gebruiken. Er zijn andere "verwante" modules die nauwkeuriger met de datum en de kalender van je systeem werken, maar deze module richt zich vooral op het manipuleren van tijd — werken met uren tot op milliseconden.

Een term die je vaak tegenkomt wanneer je met tijd in de informatica werkt, is epoch.

Maar zorg eerst dat je de module time importeert. Dat doe je simpelweg zo:

import time

epoch

Dit is het exacte punt waarop de tijd officieel begint. Dat betekent niet de geboorte van ons zonnestelsel of het moment waarop de mens tijd begon te meten, maar ligt eigenlijk relatief dicht bij nu. Voor UNIX-systemen is de epoch 1 januari 1970, 00:00:00 (UTC) (dat was een donderdag, mocht je je dat afvragen...). Om de epoch op jouw systeem te achterhalen, kun je dit typen:

time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

Dit vertelt je het jaar (tm_year), de maand (tm_mon), de dag (tm_mday), het uur (tm_hour), de minuut (tm_min) en de seconde (tm_sec). Daarnaast de dag van de week (tm_wday) — dit is 3 omdat maandag als het begin van de week geldt en als 0 wordt geteld. Vervolgens de dag van het jaar (tm_yday), oftewel de juliaanse dag. En tot slot de zomertijdaanduiding (tm_isdst) — DST staat voor daylight saving time (zomertijd). Dit veld heeft de waarden 0, -1 of 1. 0 als zomertijd niet van kracht is, 1 als zomertijd wel van kracht is en -1 als de informatie niet beschikbaar is. Waarom niet beschikbaar? Omdat regels voor zomertijd door lokale wetgeving worden bepaald en kunnen veranderen.

De meeste computers slaan datum en tijd op als het verschil in seconden tussen 1 januari 1970, 00:00:00 (UTC) en het tijdstip dat moet worden opgeslagen. Als je dus het volgende typt:

time.time()
1548611182.872067

Dan zie je het aantal seconden dat verstreken is sinds 1 januari 1970, 00:00:00 (UTC). Dit verschil noemen we een timestamp of UNIX-epochtijd, en het is een drijvendekommagetal. Nou ja... om eerlijk te zijn is het verschil niet in seconden maar in zogeheten ticks. Op de meeste UNIX-systemen tikt de klok 50 tot 100 keer per seconde. De UNIX-epochtijd is dus eigenlijk het aantal ticks dat heeft plaatsgevonden sinds 1 jan 1970, 00:00:00 UTC.

Nu je een idee hebt wat de module time doet, kijken we naar de functie sleep().

time.sleep()

Simpel gezegd: time.sleep() neemt als argument het aantal seconden dat je wilt dat het programma pauzeert of wordt onderbroken voordat het doorgaat naar de volgende stap. Laten we dat zien met een eenvoudig programma, waarin we de huidige tijd afdrukken met een pauze van 5 seconden tussen elke volgende uitvoer — we creëren dus een verschil van 5 seconden tussen elke print van de huidige tijd. Met time.ctime() zie je de lokale tijd in een prettig opgemaakte weergave.

for count in range(5):
    print(time.ctime())
    # Prints the current time with a five second difference
    time.sleep(5)
Sun Jan 27 18:46:24 2019
Sun Jan 27 18:46:29 2019
Sun Jan 27 18:46:34 2019
Sun Jan 27 18:46:39 2019
Sun Jan 27 18:46:44 2019

De syntaxis voor de functie is: time.sleep(sec), waarbij sec het argument is dat het aantal seconden aangeeft dat het programma moet pauzeren. De functie geeft geen waarde terug.

sec — Dit argument is eigenlijk een drijvendekommagetal, dus je kunt de slaaptijd nauwkeuriger maken. Dit is echter enigszins onzeker, omdat de daadwerkelijke onderbrekingstijd korter kan zijn dan de gevraagde tijd of willekeurig langer. Om te begrijpen waarom: stel je voor dat het programma een taak is die door een winkelmedewerker wordt behandeld — wanneer je het programma onderbreekt, krijgt de persoon die eraan werkte meteen een andere klant toegewezen. Maar kort daarna (sneller dan het opgegeven aantal slaapseconden) pakt een andere vrije medewerker de taak op en rondt die af — waardoor de onderbrekingstijd korter kan zijn. Evenzo kan de onderbrekingstijd willekeurig langer zijn dan gevraagd, vanwege de planning van taken voor alle medewerkers in de winkel, en moet het programma dus op zijn beurt wachten. Intern is dit natuurlijk complexer en er zijn al veel manieren geïntroduceerd om hiermee om te gaan.

for count in range(3):
    print(time.ctime())
    # Prints the current time with a five second difference
    time.sleep(2.5)
Sun Jan 27 18:46:49 2019
Sun Jan 27 18:46:52 2019
Sun Jan 27 18:46:54 2019

Python geeft geen garanties over het gedrag van deze functieaanroepen, zeker niet cross-platform. De onderliggende reden is dat de meeste functies die in deze module zijn gedefinieerd, platform-C-bibliotheekfuncties met dezelfde naam aanroepen. De nauwkeurigheid hangt echt af van de slaaptijdnauwkeurigheid van het onderliggende besturingssysteem. Als je dit verder wilt uitzoeken, is het verstandig de platformdocumentatie te raadplegen, omdat de semantiek van deze functies tussen platforms verschilt.

Er is echter goed nieuws: vanaf Python versie 3.5 slaapt time.sleep(secs) nu minimaal secs (het meegegeven argument), zelfs als de slaap wordt onderbroken door een signaal (zie het signaal opnieuw als een winkelmedewerker, zoals hierboven besproken), behalve als de signaalhandler een uitzondering opwerpt.

Wat gebeurt er intern bij het gebruik van time.sleep()?
Dit deel is bedoeld om de functie beter te begrijpen, maar is niet nodig om ermee aan de slag te gaan. De functie gebruikt de system clock, een elektronisch onderdeel in een computer dat een constante hoogfrequente puls afgeeft die alle interne componenten synchroniseert en onderdeel is van de processor. Deze module veroorzaakt zogeheten Interrupt Requests (IRQ's) op programmeerbare intervallen. De IRQ's onderbreken de code die de processor op dat moment uitvoert, slaan de huidige toestand op en dragen de controle over aan een ander stuk code in het besturingssysteem.
Wat de functie sleep() doet, is een onderliggende I/O-completion-routine of asynchronous procedure call aanroepen om het proces te blokkeren. Het OS noteert dat je niets anders wilt doen tot een timeout is bereikt. Zodra deze timeout verstrijkt, hervat het OS je proces vanaf de laatst bekende toestand. En vanuit jouw perspectief was er gewoon een aanroep naar de functie time.sleep().

Gefeliciteerd met het onder de knie krijgen van de functie time.sleep(). Bekijk zeker de cursus Python Data Science Toolbox (Part 1) van DataCamp om meer te leren over functies in Python.

Onderwerpen