{"id":1915,"date":"2024-09-02T16:57:45","date_gmt":"2024-09-02T15:57:45","guid":{"rendered":"https:\/\/blog.univ-angers.fr\/mathsinfo\/?p=1915"},"modified":"2024-09-02T16:58:18","modified_gmt":"2024-09-02T15:58:18","slug":"representation-du-temps-informatique-et-temps-chronologique","status":"publish","type":"post","link":"https:\/\/blog.univ-angers.fr\/mathsinfo\/2024\/09\/02\/representation-du-temps-informatique-et-temps-chronologique\/","title":{"rendered":"Repr\u00e9sentation du temps &#8211; Informatique et temps chronologique"},"content":{"rendered":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Repr\u00e9sentation du temps - Informatique et temps chronologique\" width=\"584\" height=\"329\" src=\"https:\/\/www.youtube.com\/embed\/sQDnzLLFPXc?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conflit de ressources<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>import threading\nimport time\n\n# Nombre de tickets disponibles (ressource partag\u00e9e)\nnb_tickets  = 10\n\ndef achat_ticket():\n  global nb_tickets \n  if nb_tickets  &gt; 0:\n    # Simuler une lecture de la base de donn\u00e9es\n    current_tickets = nb_tickets \n    # Simuler un d\u00e9lai\n    time.sleep(0.1)\n    # Simuler une \u00e9criture dans la base de donn\u00e9es\n    nb_tickets  = current_tickets - 1\n    print(f\"Ticket achet\u00e9, tickets restants : {nb_tickets }\\n\")\n  else: print(\"Plus de tickets disponibles.\\n\")\n\n# Plusieurs utilisateurs essayant d'acheter des tickets en m\u00eame temps\n\nfor _ in range(20):\n  threading.Thread(target=achat_ticket).start()<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Version avec verrou<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>import threading\nimport time\n\n# Nombre de tickets disponibles (ressource partag\u00e9e)\nnb_tickets  = 10\nlock = threading.Lock()\n\ndef achat_ticket():\n  global nb_tickets\n  with lock:\n   if nb_tickets  &gt; 0:\n    # Simuler une lecture de la base de donn\u00e9es\n    current_tickets = nb_tickets \n    # Simuler un d\u00e9lai\n    time.sleep(0.1)\n    # Simuler une \u00e9criture dans la base de donn\u00e9es\n    nb_tickets  = current_tickets - 1\n    print(f\"Ticket achet\u00e9, tickets restants : {nb_tickets }\\n\")\n   else: print(\"Plus de tickets disponibles.\\n\")\n\n# Plusieurs utilisateurs essayant d'acheter des tickets en m\u00eame temps\n\nfor _ in range(20):\n  threading.Thread(target=achat_ticket).start()<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Version SQL<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>import sqlite3\n\ndef buy_ticket(event_name):\n    try:\n        # Connexion \u00e0 la base de donn\u00e9es SQLite (ou cr\u00e9ation de la base si elle n'existe pas)\n        conn = sqlite3.connect('example.db')\n        cursor = conn.cursor()\n\n        # D\u00e9marrer une transaction\n        cursor.execute('BEGIN TRANSACTION')\n\n        # \u00c9tape 1 : V\u00e9rifier le nombre de tickets disponibles\n        cursor.execute('SELECT available_tickets FROM tickets WHERE event_name = ?', (event_name,))\n        result = cursor.fetchone()\n\n        if result is None:\n            print(f\"\u00c9v\u00e9nement '{event_name}' introuvable.\")\n            conn.rollback()\n            return\n\n        available_tickets = result&#091;0]\n        print(f\"Tickets disponibles avant l'achat : {available_tickets}\")\n\n        if available_tickets &gt; 0:\n            # \u00c9tape 2 : R\u00e9server un ticket\n            cursor.execute('UPDATE tickets SET available_tickets = available_tickets - 1 WHERE event_name = ?', (event_name,))\n            print(\"Achat r\u00e9ussi !\")\n\n            # Valider la transaction\n            conn.commit()\n        else:\n            print(\"\u00c9chec de l'achat : plus de tickets disponibles.\")\n            conn.rollback()\n\n    except sqlite3.Error as e:\n        print(f\"Erreur SQL : {e}\")\n        conn.rollback()\n    finally:\n        conn.close()\n\n# Exemple d'utilisation avec plusieurs \"acheteurs\"\nif __name__ == \"__main__\":\n    # Cr\u00e9ation de la table et insertion initiale (ex\u00e9cut\u00e9 une seule fois)\n    conn = sqlite3.connect('example.db')\n    cursor = conn.cursor()\n    cursor.execute('''\n    CREATE TABLE IF NOT EXISTS tickets (\n        id INTEGER PRIMARY KEY AUTOINCREMENT,\n        event_name TEXT NOT NULL,\n        available_tickets INTEGER NOT NULL\n    )\n    ''')\n    cursor.execute('INSERT INTO tickets (event_name, available_tickets) VALUES (?, ?)', ('concert', 100))\n    conn.commit()\n    conn.close()\n\n    # Simulation d'achats concurrents\n    for _ in range(55): buy_ticket('concert')<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Fuseaux horaires<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>from datetime import datetime\nimport pytz\n\n# Obtenir l'heure actuelle en UTC\nutc_now = datetime.now(pytz.utc)\nprint(f\"Heure actuelle en UTC : {utc_now}\")\n\nfor endroit in 'Europe\/Paris', 'America\/New_York', 'Africa\/Cairo', 'Australia\/Sydney', 'Asia\/Tokyo', 'Antarctica\/Troll':\n local_tz = pytz.timezone(endroit)\n local_time = utc_now.astimezone(local_tz)\n print(f\"Heure locale {endroit} : {local_time}\")<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Conflit de ressources Version avec verrou Version SQL Fuseaux horaires<\/p>\n","protected":false},"author":4913,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-1915","post","type-post","status-publish","format-standard","hentry","category-youtube"],"_links":{"self":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/1915","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/users\/4913"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/comments?post=1915"}],"version-history":[{"count":1,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/1915\/revisions"}],"predecessor-version":[{"id":1916,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/1915\/revisions\/1916"}],"wp:attachment":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/media?parent=1915"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/categories?post=1915"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/tags?post=1915"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}