Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python, thread and gobject

I am writing a program by a framework using pygtk. The main program doing the following things:

  1. Create a watchdog thread to monitor some resource
  2. Create a client to receive data from socket
  3. call gobject.Mainloop()

but it seems after my program enter the Mainloop, the watchdog thread also won't run.

My workaround is to use gobject.timeout_add to run the monitor thing.

But why does creating another thread not work?

Here is my 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()

The program output only "Watchdog running...Enter mainloop..", then nothing. Seems thread never run after entering mainloop.

like image 772
David Guan Avatar asked Nov 25 '09 12:11

David Guan


1 Answers

Can you post some code? It could be that you have problems with the Global Interpreter Lock.

Your problem solved by someone else :). I could copy-paste the article here, but in short gtk's c-threads clash with Python threads. You need to disable c-threads by calling gobject.threads_init() and all should be fine.

like image 140
extraneon Avatar answered Sep 19 '22 23:09

extraneon