2009-12-10 7 views
8

C'è un modo per garantire che una goroutine venga eseguita solo in un thread del sistema operativo specifico? Ad esempio, quando le operazioni della GUI devono essere eseguite nel thread della GUI, ma potrebbero esserci più goroutine che eseguono il codice della GUI.Forzatura di goroutine nello stesso thread

GOMAXPROCS(1) fa tecnicamente il lavoro, ma ciò vanifica lo scopo del multithreading.

LockOSThread() funziona anche, ma questo impedisce a qualsiasi altra goroutine di funzionare anche in quel thread.

C'è un modo per farlo, o tutto ciò che richiede lo stesso thread viene eseguito anche nella stessa goroutine?

risposta

8

Al meglio delle mie conoscenze, attualmente non. Penso che il modo "go-like" per farlo sarebbe scrivere una Goroutine che viene eseguita nel thread della GUI e le richieste di servizi da altre goroutine inviate su un canale. Ad esempio, è possibile farlo leggere da un canale che accetta i puntatori di funzione ed eseguire tali funzioni.

+2

-1 La tua risposta a "C'è un modo per garantire che una goroutine venga eseguita solo in un thread del sistema operativo specifico?" è "scrivi una Goroutine che viene eseguita nel thread della GUI"? Come dovrebbe aiutarmi? –

+3

Hai già sottolineato che LockOSThread ti consente di bloccare la goroutine su un thread specifico. Basta farlo per il thread della GUI. –

+0

Ciò consente di bloccare la goroutine sul thread * current *, non su un thread specifico arbitrario. – robx

3

Perché vuoi farlo? Credo che runtime.LockOSThread() sia necessario se si sta creando un binding di libreria dal codice C che utilizza l'archiviazione locale del thread. Altrimenti, lascia che lo schedulatore multiplex le goroutine per te.

E notare che runtime.LockOSThread() impedisce solo l'esecuzione di altre goroutine in tale thread finché non si chiama runtime.UnlockOSThread().

+0

1) Come indicato dall'OP, il codice della GUI ha bisogno di goroutine per la concorrenza ma potrebbe non voler condividere la priorità delle risorse della CPU con un altro codice che ha bisogno di un throughput più elevato, anche se ciò potrebbe non essere desiderabile; 2) La possibilità di [limitare le goroutine generate] (https://stackoverflow.com/questions/30646391/does-runtime-lockosthread-allow-child-goroutines-to-run-in-same-os-thread) allo stesso Thread del sistema operativo [potrebbe aiutare nella progettazione senza blocco della concorrenza] (https://github.com/keean/zenscript/issues/17#issuecomment-359338947). –

Problemi correlati