'Creates multiple threads using fast (but complex) marshalling.
The marshal stream is created once, and each thread uses the same stream
Returns the handles the threads will set when complete.'

def BeginThreadsFastMarshal(self, numThreads):

    interp = win32com.client.Dispatch('Python.Interpreter')
    if freeThreaded:
        interp = pythoncom.CoMarshalInterThreadInterfaceInStream(pythoncom.IID_IDispatch, interp._oleobj_)
    events = []
    threads = []
    for i in range(numThreads):
        hEvent = win32event.CreateEvent(None, 0, 0, None)
        t = threading.Thread(target=self._testInterpInThread, args=(hEvent, interp))
        t.setDaemon(1)
        t.start()
        events.append(hEvent)
        threads.append(t)
    return (threads, events)
