版權聲明:本文可能為部落客原創文章,若标明出處可随便轉載。 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!")
}