Neat idea, but checkout that horrible horrible synchronous message pass to the gtk idle thread ...
def execute((R, function, args, kwargs)):
R.result = apply(function, args, kwargs)
while R.result is NoResult:
time.sleep(0.01)
return R.result
ouch.