2009-12-10 7 views
8

Gibt es eine Möglichkeit, sicherzustellen, dass eine Goroutine nur in einem bestimmten OS-Thread ausgeführt wird? Zum Beispiel, wenn GUI-Operationen im GUI-Thread ausgeführt werden müssen, aber mehrere GUI-Routinen, die GUI-Code ausführen.Erzwingen von Goroutines in denselben Thread

GOMAXPROCS(1) macht den Job technisch, aber das vereitelt den Zweck des Multithreading.

LockOSThread() funktioniert auch, aber das verhindert, dass andere Goroutine in diesem Thread als auch ausgeführt wird.

Gibt es eine Möglichkeit dies zu tun, oder muss alles, was den gleichen Thread benötigt, auch in der gleichen Routine laufen?

Antwort

8

Soweit ich weiß, derzeit nicht. Ich denke, der "go-like" Weg, dies zu tun, würde darin bestehen, eine Goroutine zu schreiben, die in den GUI-Thread- und -Dienstanfragen von anderen über einen Kanal eingesendeten Goroutinen läuft. Sie können es beispielsweise von einem Kanal lesen lassen, der Funktionszeiger akzeptiert, und diese Funktionen ausführen.

+2

-1 Ihre Antwort auf "Gibt es eine Möglichkeit sicherzustellen, dass eine Goroutine nur in einem bestimmten Betriebssystem-Thread ausgeführt wird?" ist "schreibe eine Goroutine, die im GUI-Thread läuft"? Wie soll das mir helfen? –

+3

Sie haben bereits darauf hingewiesen, dass Sie mit LockOSThread die Goroutine an einen bestimmten Thread binden können. Tun Sie das einfach für den GUI-Thread. –

+0

Damit können Sie die Goroutine auf den * aktuellen * Thread, nicht auf einen beliebigen spezifischen Thread sperren. – robx

3

Warum möchten Sie das tun? Ich glaube, dass runtime.LockOSThread() erforderlich ist, wenn Sie eine Bibliotheksbindung aus C-Code erstellen, die Thread-lokalen Speicher verwendet. Andernfalls lass den Scheduler die Gordoutinen für dich multiplexen.

Und beachten Sie, dass runtime.LockOSThread() nur verhindert, dass andere goroutines in diesem Thread ausgeführt werden, bis Sie runtime.UnlockOSThread() aufrufen.

+0

1) Wie das OP impliziert, benötigt der GUI-Code goroutines für den gemeinsamen Zugriff, möchte aber möglicherweise die Priorität der CPU-Ressourcen nicht mit anderem Code teilen, der einen höheren Durchsatz benötigt, obwohl dies unerwünscht sein könnte; 2) Die Fähigkeit, [launched goroutines] zu beschränken (https://stackoverflow.com/questions/30646391/does-runtime-lockosthread-allow-child-goroutines-to-run-in-same-o-thread) zu demselben OS-Thread [könnte bei der Lockless-Gestaltung von Parallelität helfen] (https://github.com/keean/zenscript/issues/17#issuecomment-359338947). –

Verwandte Themen