Golang、python多線程很是典型例子,對照兩門語言計算速度.

好比咱們 從1加到100,咱們小時候就知道 101*50=5050,這是利用了算法,可是咱們這裏沒有討論算法,只是驗證計算機的計算能力,在GO語言中,咱們這樣設計遍歷。python

func main() {
   ts := time.Now().UnixNano()
   h := 1000000000
   sum := 0

   for i := 0; i <= h; i++ {
      sum = sum + i
   }
   
fmt.Println(sum)
   fmt.Print("時間毫秒:")
   fmt.Println((time.Now().UnixNano() - ts) / 1000000)
}

計算結果:算法

500000000500000000多線程

時間毫秒:289併發

這樣單線程計算的話,浪費了計算機的多核性能,並且GO的併發就是利用多核,所以咱們開闢幾個線程,每一個線程計算一段,好比咱們要計算1到100等於多少,就能夠開闢10個線程,分別計算1-10,10-20等等。app

func Count1(start int, end int, ch chan int) {
   var cccc int
   for j := start; j < end; j++ {
      cccc = cccc + j
   }
   ch <- cccc
}
func main() {
   ts := time.Now().UnixNano()
   h := 1000000000
   sum := 0
   ch := make(chan int, 50)
   numLength := cap(ch)

   for i := 0; i < numLength; i++ {
      num := h / numLength
      go Count1(num*i, num*i+num, ch)
   }
   for i := 0; i < numLength; i++ {
      select {
      case msg := <-ch:
         sum = sum + msg

      }
   }
   fmt.Println(sum + h)
   fmt.Print("時間毫秒:")
   fmt.Println((time.Now().UnixNano() - ts) / 1000000)
}

計算結果:性能

500000000500000000ui

時間毫秒:75spa

能夠對比一下,效率提升了4-5倍,所以咱們能夠推斷,我在網吧用的計算機的cpu核數大約在4-8核之間,CPU核數通常是2的次方計算,並且系統不會把CPU的計算能力所有分配個人程序,因此8核最爲可靠,(本身沒有電腦,也買不起,在這裏上網6元一個小時,衝100送100,屬於電競區,還能夠接受,其餘的區間4元一小時),其實也能夠看到並無徹底利用8核所有性能,由於這是系統緣由。線程

看下python設計

先寫個單線程的列子:此次計算100000000,注意這比上面的GO語言計算數目少了一個0。

import  time
sum=0
ts=time.time()
for i in range (100000000):
    sum=sum+i
print('花費時間:(秒)  '+ str( time.time()-ts))

結算結果:

花費時間:(秒)  10.329591035842896

能夠對照下,python的遍歷計算能力有點弱,由於它屬於腳本,每次生成一個對象,因此建立對象消耗的時間太高。

再寫多線程,分段計算:

import threading
import time
ts=time.time()
mutex = threading.Lock()
sumList=[]

def Count(start,end):
    count=0
    for i in range(start,end):
        count = count + i

    mutex.acquire()
    sumList.append(int(count))
    mutex.release()
li = []
h=100000000
sliceLen=10
for i in range(sliceLen):
    num = int (h / sliceLen)
    th = threading.Thread(target=Count, args=(num*i,num*i+num))
    th.start()
    li.append(th)
for i in li:
     i.join()
print(sum(sumList)+h)
print('花費時間:(秒)  '+ str( time.time()-ts))

花費時間:(秒)  6.120349884033203

能夠看到PYTHON中並無真正徹底利用多核性,因爲GIL的限制,並無真正利用多核來計算,不過因爲分擔了一些其餘的工做,減小了主CPU負擔,所以性能也比單線程提升不少。

相關文章
相關標籤/搜索