Is there a way to not block PyGTK while performing some expensive operation? I know threading would work but it would take a lot of code and setup.
Thanks,
Avoid threads, they don't work well at all with PyGTK. Some alternatives:

For IO/networking operations where you read from a file descriptor, use
glib.io_add_watch() 
Move the operations to a separate process and
communicate with it using glib.spawn_async()

Twisted is a great library for doing networking, which is completely non-blocking and integrates well with the PyGTK mainloop, consider using that.
PyGTK nonblocking