天天看點

多核心利用

版權聲明:本文可能為部落客原創文章,若标明出處可随便轉載。 https://blog.csdn.net/Jailman/article/details/78552518

沒有比較用時,有興趣的同學可以自己試試。

下邊的例子可以看到gevent是單線程下的高并發,在沒有DMA異步IO(比如網絡通信)的情況下,實際效果和同步的效率一樣,甚至可能會更低。

#!/usr/bin/python

from gevent import monkey; monkey.patch_all()
import multiprocessing
import gevent as g


def calc():
    x = 0
    for i in xrange(2300000000):
        x += i
    print x


def coroutine():
    g.joinall([g.spawn(calc) for x in xrange(24)])


coroutine()           

配合多程序将CPU全都跑到100%

#!/usr/bin/python

import multiprocessing
import gevent as g


def calc():
    x = 0
    for i in xrange(2300000000):
        x += i
    print x


def coroutine():
    g.joinall([g.spawn(calc) for x in xrange(24)])


pool = multiprocessing.Pool(processes = 24)

for h in xrange(24):
    pool.apply_async(coroutine)

pool.close()
pool.join()           

golang明顯更簡單,因為go在底層封裝了一些異步的函數,是以用起來十分友善,不使用runtime就會單程序在一顆CPU上跑,使用和邏輯CPU相同數目的程序就會把全部CPU跑滿,基本上可以說和上邊python的協程一樣。

package main

import "fmt"
import "runtime"

var ch chan int = make(chan int, 50)

func calc() {
    x := 0
    for a := 0; a < 2300000000; a++ {
      x += a
    }
    ch <- x
}

func main() {
    runtime.GOMAXPROCS(24)
    for i := 0; i < 24; i++ {
        go calc()
    }
    for v := range ch {
        fmt.Println(v)
        if len(ch) <= 0 {
            break
        }
    }
    fmt.Println("Done!")
}