2010-12-12 4 views
2

J'ai une application (Gtk) qui a un serveur embarqué (en utilisant des circuits). Les deux composants (l'interface graphique et le serveur) ont des boucles infinies. Comment puis-je exécuter les deux boucles simultanément?Comment puis-je exécuter 2 boucles simultanément en python?

J'ai également besoin que la boucle du serveur se termine lorsque la boucle gtk se termine.

Le code pour l'exemple serveur

from circuits.web import Server, Controller 
import os 

class MyServer(Controller): 

    def index(self): 

     return "Hello World" 


server = Server(8000) 
server += MyServer() 
server.run() 

et le code par exemple l'application GTK

import gtk 

class App: 

    def __init__(self): 

     self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     self.window.connect("destroy",gtk.main_quit) 
     self.window.show_all() 

     gtk.main() 

if __name__ == '__main__': 
    app = App() 
+0

Vous devez choisir l'une des boucles, et exécuter l'autre de l'intérieur. Je ne suis pas sûr que le framework de circuits l'ait, mais le gtk a une fonction qui exécute une fois l'intérieur de la boucle principale. –

Répondre

2

Vous pouvez utiliser le module multiprocessing pour ce faire:

from multiprocessing import Process 

def run_app(): 
    ... run the app ... 

def run_server(): 
    ... run the server ... 

def main(): 
    app = Process(target=run_app) 
    app.start() 

    server = Process(target=run_server) 
    server.start() 

    app.join() 
    server.terminate() 

if __name__ == "__main__": 
    main() 

Dans le cas contraire, Si vous utilisez Python < 2.6 sur Unix, vous pouvez violer arou nd avec os.fork() pour faire le même genre de chose. Threadingpeut travailler, mais je ne sais pas comment GTK ou circuits joue avec les threads.

+0

C'est parfait. – AssemblerGuy

+0

Jetez également un coup d'œil à Python sans pile http://www.stackless.com/. Il est conçu pour pouvoir exécuter de nombreuses tâches simultanées comme celle-ci. Je ne l'ai jamais utilisé, mais il a l'air cool. Je ne sais pas si cela fonctionnera avec les applications gtk ou non. – Falmarri

1

Vous pouvez exécuter le serveur Web à partir d'un autre thread:

from threading import Thread 

# ... 

server = Server(8000) 
server += MyServer() 

web_server_thread = Thread(target=server.run) 
web_server_thread.start() 

gtk.main() 
+0

Threading ne fonctionne pas pour moi ne sais pas pourquoi. J'essayais de comprendre comment cela fonctionne toute la journée, mais je ne pouvais pas le faire fonctionner pour mon cas, car je suis incapable de le comprendre. Je vais essayer votre exemple. Merci beaucoup. – AssemblerGuy

Questions connexes