2009-11-25 6 views
6

Ich schreibe ein Programm von einem Framework mit pygtk. Das Hauptprogramm die folgenden Dinge zu tun:Python, Thread und Gobject

  1. einen Watchdog-Thread erstellen eine Ressource
  2. Erstellen Sie eine Client zu überwachen, um Daten aus dem Socket
  3. Anruf gobject.Mainloop()

aber es scheint, nach meinem Programm Geben Sie den Mainloop ein, der Watchdog-Thread wird ebenfalls nicht ausgeführt.

Meine Problemumgehung ist, gobject.timeout_add zu verwenden, um die Monitor-Sache auszuführen.

Warum funktioniert das Erstellen eines anderen Threads nicht?

Hier ist mein Code:

import gobject 
import time 
from threading import Thread 

class MonitorThread(Thread): 

    def __init__(self): 
     Thread.__init__(self) 

    def run(self): 
     print "Watchdog running..." 
     time.sleep(10) 

def main(): 

    mainloop = gobject.MainLoop(is_running=True) 

    def quit(): 
     mainloop.quit() 

    def sigterm_cb(): 
     gobject.idle_add(quit) 


    t = MonitorThread() 
    t.start() 

    print "Enter mainloop..." 

    while mainloop.is_running(): 
     try: 
      mainloop.run() 
     except KeyboardInterrupt: 
      quit() 

if __name__ == '__main__': 

    main() 

Das Programm Ausgabe nur "Watchdog läuft ... Bitte geben Sie mainloop ..", dann nichts mehr. Scheint, dass der Thread nach dem Eintragen der Hauptschleife nie ausgeführt wird.

+1

Was erwarten Sie mehr? Mit dem obigen Code erwarte ich, dass diese beiden Dinge jeweils einmal gedruckt werden. – u0b34a0f6ae

Antwort

9

Können Sie etwas Code posten? Es könnte sein, dass Sie Probleme mit dem Global Interpreter Lock haben.

Your problem solved by someone else :). Ich könnte den Artikel hier kopieren, aber kurz gesagt, die C-Threads von gtk kollidieren mit Python-Threads. Sie müssen c-threads deaktivieren, indem Sie gobject.threads_init() aufrufen und alle sollten in Ordnung sein.

+0

Danke, ich füge ein Code-Snippet hinzu, irgendwas falsch mit diesem Code? –

+0

Bekam es. Danke für die Information. –

+2

Ich bin froh, dass Sie einen kurzen Hinweis in der Antwort hinzugefügt haben, da der Link jetzt tot ist. – vidstige

2

Sie konnten die Thread-basierten Codepfade in gtk nicht initialisieren.

Sie müssen zwei Dinge erinnern, wenn mit Gewinde mit PyGTK:

  1. GTK Themen müssen mit gtk.gdk.threads_init initialisiert werden:

Von http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html, Copyright vollständig erhalten nach Autor. Dieser Copyright-Hinweis darf nicht entfernt werden.

Sie können glib/gobject anstelle von pygtk denken, es ist das gleiche.

+0

Danke, ich bin neu in GTK. Die Information hilft. –