用Go的協程與通道輸出1到100000之間的所有素數

引言

  下面用Go的協程與通道實現一個計算並輸出1到100000之間的所有素數的算法。側重點看一下,怎樣將協程與通道結合起來使用以及怎樣提高運行時性能。

實現流程

具體的實現:

第一步,創建一個協程,將需要處理的數據,讀入到通道dataList中。

第二步,創建四個協程(具體數量跟機器的CPU核心數有關,見程序。),用來分別從dataList通道讀取數據,並進行是否是素數的判斷,如果是,則會被寫入results通道中。

第三步,對results通道中的數據進行合併處理。

第四步,輸出結果。

用Go的協程與通道輸出1到100000之間的所有素數

將數據寫入dataList通道

用Go的協程與通道輸出1到100000之間的所有素數

從dataList通道讀取數據並處理

用Go的協程與通道輸出1到100000之間的所有素數

計算素數

  在這裡使用的算法是:首先,num不能是1,然後用num依次除以2到num-1中的數,只要有一個餘數為零,就不是素數,如果都不為零,則是素數。當然,這只是其中的一個算法,應該還有其他的計算方法。

用Go的協程與通道輸出1到100000之間的所有素數

合併數據,最後輸出結果

  需要注意的一點是,在這裡使用for循環而不是for...range來遍歷通道。因為對於一個可讀寫的通道來說,用for...range進行遍歷時,它會一直執行讀的操作,直到遇到通道被關閉才停止,因此對一般通道來說很容易會產生死鎖。

用Go的協程與通道輸出1到100000之間的所有素數

main函數

用Go的協程與通道輸出1到100000之間的所有素數

運行

用Go的協程與通道輸出1到100000之間的所有素數

在這裡只是實現了一種方法,實際運行時在性能上以及數據結構的選用上還需要再進一步改進。


分享到:


相關文章: