2016-10-31 5 views
-2

異なるプロセスで3つのルーチンを実行したい。調査の結果、runtime.GOMAXPROCS()を使用する必要があることがわかりました。しかし、runtime.GOMAXPROCS()を使用しても、すべてのルーチンは同じプロセスで実行されます。どのように私はそれを別のプロセスで実行することができます。以下はコードと出力です。ここでGo lang:異なるプロセスでルーチンを実行する

Number of CPU 8 
Process id of main 16874 

Process id of 0 go routine 16874 
Process id of 2 go routine 16874 
Process id of 1 go routine 16874 
Process id of 0 go routine 16874 
Process id of 1 go routine 16874 
Process id of 2 go routine 16874 
Process id of 0 go routine 16874 
Process id of 1 go routine 16874 
Process id of 2 go routine 16874 
Process id of 2 go routine 16874 
Process id of 0 go routine 16874 
Process id of 1 go routine 16874 

あなたは私がGOMAXPROCSを使用しているにもかかわらず、同じプロセス上のすべてのルーチンの実行を見ることができます:ここでgoplayground

func main() { 

    runtime.GOMAXPROCS(4) 

    fmt.Printf("Number of CPU %d \n",runtime.NumCPU()) 

    fmt.Printf("Process id of main %d \n\n",os.Getpid()) 


    for i:=0 ;i<3; i++{ 
     go printAndSleep(i) 
    } 

    time.Sleep(time.Second * 100) 

} 

func printAndSleep(i int){ 
    for { 
     fmt.Printf("Process id of %d go routine %d \n",i,os.Getpid()) 
     time.Sleep(time.Second * 2) 
    } 
} 

出力へのリンクです。何故ですか?私が間違って使用しています

+2

実行中のゴルーチンは、最大GOMAXPROCS OSスレッド全体で多重化されます。 1つのプロセスしかありません。 – JimB

+0

ありがとう@JimBしかし、GOMAXPROCS(1)とGOMAXPROCS(2)の違いを実行IDや何かのように確認する方法はありますか? – TheLion

+0

Goは、並列性のために設計されています。したがって、Goランタイムは、ルーチンがどのように実行されるかを決定します。それはGoの能力です。つまり、自分で決める理由はありません(Goではなく)。 google "同時性が並列性ではない"場合は、Go並行性設計に関するいくつかの話題があります。 – jnmoal

答えて

-1

各プロセスで1つのゴルーチンしか実行しないようにするには、runtime.LockOSThread()を使用して、そのプロセスで実行されているプロセスとゴルーチンの間に1対1の関係を作ってください。あなたのケースでは、新しいゴルーチンを起動するたびにruntime.LockOSThreadを呼び出す必要があります。

for i:=0 ;i<3; i++{ 
    go func(){ 
     runtime.LockOSThread() 
     printAndSleep(i) 
    }() 
} 
関連する問題