I'd say go with option 1. Pass the window handler (or DC) to the rendered thread. To overcome the GIL problem, you can use Py_BEGIN_ALLOW_THREADS (see http://docs.python.org/release/1.5.2/api/threads.html)