2009-12-10 9 views
8

¿Hay alguna manera de garantizar que un goroutine se ejecute solo en un hilo específico del sistema operativo? Por ejemplo, cuando las operaciones de la GUI deben ejecutarse en el hilo de la GUI, pero puede haber múltiples goroutines corriendo el código GUI.Forzar los goroutines en el mismo hilo

GOMAXPROCS(1) hace el trabajo técnicamente, pero eso frustra el propósito del multihilo.

LockOSThread() funciona también, pero eso evita que cualquier otra rutina de ejecución se ejecute en ese hilo también.

¿Hay alguna manera de hacer esto o todo lo que requiere el mismo hilo también se ejecuta en la misma rutina?

Respuesta

8

Que yo sepa, actualmente no. Creo que la forma de hacer esto sería escribir un Goroutine que se ejecute en el hilo de la GUI y las solicitudes de servicios de otros goroutines enviados a través de un canal. Por ejemplo, puede hacer que se lea desde un canal que acepta punteros a funciones y ejecutar esas funciones.

+2

-1 Su respuesta a "¿Hay alguna manera de asegurarse de que una rutina de administración se ejecute solo en una secuencia de sistema operativo específica?" es "escribir un Goroutine que se ejecuta en el hilo de GUI"? ¿Cómo se supone que esto me ayudará? –

+3

Ya ha señalado que LockOSThread le permite bloquear la rutina de un hilo específico. Simplemente hazlo para el hilo de GUI. –

+0

Eso le permite bloquear la rutina con el subproceso * actual *, no con un subproceso específico arbitrario. – robx

3

¿Por qué quieres hacer esto? Creo que es necesario runtime.LockOSThread() si está creando un enlace de biblioteca desde el código C que utiliza almacenamiento local de subprocesos. De lo contrario, simplemente deje que el planificador multiplexe los goroutines por usted.

y observe que runtime.LockOSThread() sólo impide que otros goroutines se ejecute en ese hilo hasta que llame runtime.UnlockOSThread().

+0

1) A medida que la OP implicaba el código GUI necesita goroutines para la concurrencia pero no puede desear compartir prioridad de recursos de CPU con otro código que necesita un mayor rendimiento pesar de que podría ser indeseable; 2) La capacidad de [restringir goroutines engendrados] (https://stackoverflow.com/questions/30646391/does-runtime-lockosthread-allow-child-goroutines-to-run-in-same-os-thread) a la misma OS hilo [podría ayudar en el diseño lockless de concurrencia] (https://github.com/keean/zenscript/issues/17#issuecomment-359338947). –

Cuestiones relacionadas