2016-08-24 2 views
2

golang hat nur eine Methode runtime.GOMAXPROCS(1), um die Anwendung einen goroutine zur gleichen Zeit zu setzen, aber ich möchte die Anwendung nur auf der spezifischen CPU laufen lassen?Laufen auf der spezifischen CPU, nicht eine Goroutine?

+1

Start/Affinität 1 gobinary.exe –

+0

Das Festlegen der Prozessoraffinität ist OS-spezifisch und wird am besten außerhalb des Prozesses selbst ausgeführt. Ein Befehlszeilenprogramm wie 'taskset' unter Linux ist normalerweise das, was Sie dafür verwenden. – JimB

Antwort

2

So starten Sie binäre gehen, sagen example.exe so, dass es nur auf CPU 0 auf Windows läuft, Sie start Befehl mit „Affinität“ Parameter verwenden:

start /affinity 1 example.exe 

Ich weiß nicht, was genau Sie sind versuchen zu erreichen, aber beziehen Sie sich auf this document describing GOMAXPROCS - es könnte der Fall sein, dass Go Runtime das Gleiche effizienter tun wird.

0

Unter dem gc Compiler (6g oder 8g) Sie GOMAXPROCS auf mehr als der Standardwert 1 gesetzt sein, um die Laufzeitunterstützung, damit mehr als einen OS-Thread zu verwenden, das ist alles goroutines teilen den gleichen Thread, wenn GOMAXPROCS auf einen Wert größer als 1 festgelegt ist. Wenn GOMAXPROCS größer als 1 ist, werden sie in einem Thread-Pool mit so vielen Threads ausgeführt. Mit dem gccgo Compiler GOMAXPROCS ist effektiv gleich der Anzahl der laufenden goroutines. Angenommen, n ist die Anzahl der Prozessoren oder Kerne auf der Maschine. Wenn Sie die Umgebungsvariable GOMAXPROCS >= n setzen oder runtime.GOMAXPROCS(n) aufrufen, werden die Goroutinen unter den n Prozessoren aufgeteilt (verteilt).

Mehr Prozessoren bedeuten jedoch nicht unbedingt eine lineare Verbesserung der Leistung, vor allem weil mehr Kommunikation benötigt wird: der Overhead für die Nachrichtenübermittlung steigt. Ein Erfahrungs Faustregel scheint für n Kern Einstellung GOMAXPROCS bis n-1 ergibt die beste Leistung und die folgenden sollte auch beachtet werden zu sein, dass:

number of goroutines > 1 + GOMAXPROCS > 1

Also, wenn es nur eine goroutine ausführt Zu einem bestimmten Zeitpunkt setzen Sie GOMAXPROCS nicht!

Wenn Sie eine Goroutine für einen bestimmten Betriebssystem-Thread sperren möchten, können Sie dies mit runtime.LockOSThread tun.

LockOSThread verbindet die aufrufende Goroutine mit ihrem aktuellen System-Thread. Bis die aufrufende gorutine beendet wird oder UnlockOSThread aufruft, wird sie immer in diesem Thread ausgeführt, und keine andere goroutine kann.

Mehr über auf https://golang.org/pkg/runtime/.

+1

Ich glaube nicht, dass es die Frage von OP überhaupt beantwortet. Außerdem, OS-Thread! = CPU-Kern, was ich glaube, was OP gefragt hat. – syntagma

Verwandte Themen