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}")