LAMP tout en python devient LTEP (Linux, Twisted, Elixir, Python) et en plus GTK côté client Sylvain Ferriol <[email protected]> Journées Informatique IN2P3, 25 octobre 2012 Contexte BD Serveur / Séquenceur Journées informatique IN2P3 2 Une application type WEB ● Système client serveur ● Persistance dans une base de données ● Notion de page (HTML,CSS, Javascript) ● Client léger Journées informatique IN2P3 3 Et en plus ● Communication bidirectionnelle (WebSocket) ● Synchronisation facile de plusieurs clients ● Sans changer de langage ● ● Utiliser la même librairie graphique qu'on utilise pour faire une application classique Développement rapide Journées informatique IN2P3 4 Solution ● ● Un seul langage : Python Communication réseau: Twisted avec le protocol Perspective Broker ● Persistance des données : Elixir ● Interface graphique du client : GTK Journées informatique IN2P3 5 Partie Persistance : Elixir ● Mapping objet-relationnel simple ● Respecte le design pattern Active Record ● Création automatique des tables et des clés étrangères Journées informatique IN2P3 6 Elixir : exemple class Personne( Entity ): nom = Field( String(128) ) age = Field( Integer ) adresses = OneToMany( 'Adresse' ) class Adresse( Entity ): principale = Field( Boolean ) proprietaire = ManyToOne( 'Personne' ) Journées informatique IN2P3 7 Partie réseau : Twisted ● « An event-driven networking engine » ● Framework réseau basé sur TCP,UDP ● ● ● Implémentation des protocoles : HTTP, FTP, SSH, IRC, …, dans une même application. Protocole « objet » : Perspective Broker (PB) Programmation asynchrone s 'exécutant dans un seul thread Journées informatique IN2P3 8 Twisted : modèle synchrone ● Une tâche après l'autre ● Un seul flux d'exécution Temps Journées informatique IN2P3 9 Twisted : modèle multithread ● Exécution en parallèle ● Coordination complexe des flux d'exécution ● Synchronisation difficile Temps Journées informatique IN2P3 10 Twisted : modèle asynchrone ● ● ● ● Les tâches sont entrelacées Enchaînement de petites étapes déclenchées par des événements réseaux Pas de parallélisme, synchronisation facile Programmation plus complexe car non séquentielle Temps Journées informatique IN2P3 11 Twisted : modèle asynchrone def tache() : deferred = etape_1() deferred.addCallback( etape_2 ) deferred.addCallback( etape_3 ) return deferred Journées informatique IN2P3 12 Twisted : modèle asynchrone @defer.inlineCallbacks def tache() : yield etape_1 () yield etape_2 () yield etape_3 () Journées informatique IN2P3 13 Twisted : Perspective Broker (PB) ● ● ● Appel de méthode sur des objets distants Les méthodes accessibles par l'extérieur doivent juste avoir 'remote_' comme préfixe Les objets peuvent être transférés sur le réseau – Par référence (Referenceable) – Par copie (Copyable) Journées informatique IN2P3 14 Twisted : Perspective Broker (PB) Client Referenceable Serveur Root connect() Objet : root root.callRemote('nvx', client) remote_nvx(client) client.callRemote('msg', 'hello_world') remote_msg('hello world') Journées informatique IN2P3 15 Partie graphique côté client : GTK ● Design des interfaces avec GLADE stockées dans un fichier XML ui = gtk.glade.XML('mon_fichier.glade') ● Association automatique entre les callbacks déclarés dans l'interface, et ceux définis dans le contrôleur codé en Python ui.signal_autoconnect( controleur ) ● Intégration de Twisted et GTK dans une même boucle d' événements Journées informatique IN2P3 16 WEB en python ? (html, javascript) => (glade, python) Client Referenceable Serveur Root root.callRemote('nvx', client) remote_init_gui( glade_xml, python_code) remote_show() client.callRemote('init_gui', glade_xml, python_code) Objet : gui gui.callRemote('show') Journées informatique IN2P3 17 Merci Questions ? Journées informatique IN2P3 18