Représentation du temps – Informatique et temps chronologique

Conflit de ressources

import threading
import time

# Nombre de tickets disponibles (ressource partagée)
nb_tickets  = 10

def achat_ticket():
  global nb_tickets 
  if nb_tickets  > 0:
    # Simuler une lecture de la base de données
    current_tickets = nb_tickets 
    # Simuler un délai
    time.sleep(0.1)
    # Simuler une écriture dans la base de données
    nb_tickets  = current_tickets - 1
    print(f"Ticket acheté, tickets restants : {nb_tickets }\n")
  else: print("Plus de tickets disponibles.\n")

# Plusieurs utilisateurs essayant d'acheter des tickets en même temps

for _ in range(20):
  threading.Thread(target=achat_ticket).start()

Version avec verrou

import threading
import time

# Nombre de tickets disponibles (ressource partagée)
nb_tickets  = 10
lock = threading.Lock()

def achat_ticket():
  global nb_tickets
  with lock:
   if nb_tickets  > 0:
    # Simuler une lecture de la base de données
    current_tickets = nb_tickets 
    # Simuler un délai
    time.sleep(0.1)
    # Simuler une écriture dans la base de données
    nb_tickets  = current_tickets - 1
    print(f"Ticket acheté, tickets restants : {nb_tickets }\n")
   else: print("Plus de tickets disponibles.\n")

# Plusieurs utilisateurs essayant d'acheter des tickets en même temps

for _ in range(20):
  threading.Thread(target=achat_ticket).start()

Version SQL

import sqlite3

def buy_ticket(event_name):
    try:
        # Connexion à la base de données SQLite (ou création de la base si elle n'existe pas)
        conn = sqlite3.connect('example.db')
        cursor = conn.cursor()

        # Démarrer une transaction
        cursor.execute('BEGIN TRANSACTION')

        # Étape 1 : Vérifier le nombre de tickets disponibles
        cursor.execute('SELECT available_tickets FROM tickets WHERE event_name = ?', (event_name,))
        result = cursor.fetchone()

        if result is None:
            print(f"Événement '{event_name}' introuvable.")
            conn.rollback()
            return

        available_tickets = result[0]
        print(f"Tickets disponibles avant l'achat : {available_tickets}")

        if available_tickets > 0:
            # Étape 2 : Réserver un ticket
            cursor.execute('UPDATE tickets SET available_tickets = available_tickets - 1 WHERE event_name = ?', (event_name,))
            print("Achat réussi !")

            # Valider la transaction
            conn.commit()
        else:
            print("Échec de l'achat : plus de tickets disponibles.")
            conn.rollback()

    except sqlite3.Error as e:
        print(f"Erreur SQL : {e}")
        conn.rollback()
    finally:
        conn.close()

# Exemple d'utilisation avec plusieurs "acheteurs"
if __name__ == "__main__":
    # Création de la table et insertion initiale (exécuté une seule fois)
    conn = sqlite3.connect('example.db')
    cursor = conn.cursor()
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS tickets (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        event_name TEXT NOT NULL,
        available_tickets INTEGER NOT NULL
    )
    ''')
    cursor.execute('INSERT INTO tickets (event_name, available_tickets) VALUES (?, ?)', ('concert', 100))
    conn.commit()
    conn.close()

    # Simulation d'achats concurrents
    for _ in range(55): buy_ticket('concert')

Fuseaux horaires

from datetime import datetime
import pytz

# Obtenir l'heure actuelle en UTC
utc_now = datetime.now(pytz.utc)
print(f"Heure actuelle en UTC : {utc_now}")

for endroit in 'Europe/Paris', 'America/New_York', 'Africa/Cairo', 'Australia/Sydney', 'Asia/Tokyo', 'Antarctica/Troll':
 local_tz = pytz.timezone(endroit)
 local_time = utc_now.astimezone(local_tz)
 print(f"Heure locale {endroit} : {local_time}")