顯示具有 golang 標籤的文章。 顯示所有文章
顯示具有 golang 標籤的文章。 顯示所有文章

golang 匿名函數 Anonymous Function

這個例子中,我們定義了三個匿名函式。第一個是最基礎的形式,沒有參數和返回值。第二個帶有參數 x 和 y,並在呼叫時提供了這些參數的值。第三個例子展示了閉包的概念,其中匿名函式可以訪問其外部作用域中的變數 z


package main

import "fmt"

func main() {
// 這是一個簡單的匿名函式
func() {
fmt.Println("這是一個匿名函式!")
}() // 注意最後的 (),這是用來呼叫這個匿名函式的

// 匿名函式也可以接受參數
func(x int, y int) {
fmt.Println(x + y)
}(3, 4) // 輸出 7

// 閉包:匿名函式可以存取外部的變量
z := 10
f := func() {
fmt.Println(z)
}
f() // 輸出 10
}

Concurrency in go 讀書心得 2.Concurrency ? Parallelism?

 

Concurrency 與 Parallelism 的深入探討:從差異到應用

我們常常聽到兩個詞:Concurrency(併發)與 Parallelism(平行)。儘管這兩個詞語經常被交替使用,但它們代表的概念是有所不同的。理解這兩者的差異不僅有助於技術深入,還有助於我們在設計和開發時做出明智的選擇。本文將試圖剖析這兩者的核心差異,並提供一些應用的例子。

1. Concurrency(併發)

Concurrency主要關心的是多個任務可以在同一時間段內被啟動或完成,但並不意味著這些任務是同時執行的。它是一種如何結構化程序、算法,以便有效地處理多件事情,這些事情可能(但不必)在同一時間發生。

舉個例子,一位雜技演員正在同時擲多個球,儘管每次只接觸一個球,但對觀眾來說,似乎球都在「同時」被擲。這就是concurrency的概念:雖然一次只處理一件事,但在整個過程中處理了多件事情。

2. Parallelism(平行)

平行則是指多個任務或計算過程在同一時刻真正同時進行。這通常需要多個處理器或核心,或者是分佈式的系統。

再次以例子來說明:想象一個跑道,有四名運動員同時起跑,他們同時向終點前進。這是真正的「同時」,每個運動員的跑動都是同時發生的,而不是輪流。

併發與平行的關聯

這兩者之間的關係是密不可分的。併發可以在單核系統中實現,切換上下文以模擬多個任務「似乎」同時運行。然而,當有多核或多處理器可用時,併發任務也可能平行運行。

舉例說明,當我們開啟多個網頁標籤時,這些標籤可能是併發加載的,但若我們的系統有多個核心,則可能會有多個標籤同時加載,達到平行。

結論

Concurrency 和 Parallelism 雖然有所區別,但它們共同的目的是提高效率和性能。理解它們的差異以及如何適當地應用它們,可以幫助我們設計出更加高效和響應迅速的系統和應用程序。當我們說某系統支援併發時,它可能不真正做到「同時」的執行;但當說到平行時,它真的做到了多個操作的同時進行。

Concurrency in go 讀書心得 1.前言

 

動機:希望加深對於golang concurrency的理解

去年,我也報名了ithome鐵人賽。當初帶著滿腔熱誠,想要透過連續的寫作分享知識。然而,生活總是充滿了變數。原以為能夠穩定發文的計畫,因為突然需要跟主管一起出差一週而被打破。但,過去就是過去,我認為最重要的是如何從過去的經驗中學習,並將之轉化為未來更強烈的動力。

因此,今年我決定再度參賽,但這次的目標更加明確:對Go語言的併發(Concurrency)進行深入探討。選擇這個主題,背後有兩大原因。首先,併發是Go語言中非常強大,但也相對複雜的特性。我深知為了真正理解一個技術,最好的方法就是教學以致用,透過撰寫系列文章的方式,透過將知識傳達給他人,同時鞏固自己的認知。

這次的寫作,我主要參考了一本名為《Concurrency in Go》的書籍。這本書深入淺出地探討了Go語言中併發的相關知識。我會將這些知識與心得整理成文章分享給大家,我認為這種從理論到實踐,再從實踐回到理論的過程,是學習的最佳循環。

另外,我也認為這次的挑戰不僅僅是技術層面的。時間管理、保持寫作的習慣、應對突如其來的變故......這都是參與鐵人賽所必須面對的挑戰。去年的經驗讓我明白,任何事情都有可能發生。所以,這次我已做足準備,不論是事先撰寫一些草稿,還是找尋靈感的方法,都已經備妥。

總結來說,參與鐵人賽不僅僅是技術的分享,更是一個挑戰自己的機會。我期待透過這30天的旅程,不只能與大家分享Go語言併發的魅力,更希望能夠完成我自己的小目標,彌補去年的遺憾。期待在這次的賽程中,能夠與各位一同學習、進步,共同邁向更高的技術境界。


什麼是Goroutine?


什麼是Goroutine?

 











以這張圖為例,最上面的Go program就是我們寫的程式。

在 Go 語言中,每個 Go program都運行在一個稱為 Go runtime 的運行系統之上。

Go runtime是什麼?

In Go, the runtime is an essential part of the language that manages memory allocation, garbage collection, and scheduling of goroutines. The Go program interacts with the runtime through the Go standard library, which provides an abstraction layer over the runtime. The Go program is compiled into machine code and executed by the operating system. When the program starts, it initializes the Go runtime, which sets up the memory management system, creates the main goroutine, and starts the scheduler.

The Go program can create additional goroutines to run concurrently with the main goroutine. The runtime manages the scheduling of these goroutines, ensuring that they execute efficiently and safely. The runtime also handles the communication and synchronization between goroutines through channels and other synchronization primitives. Therefore, the Go program and the Go runtime are tightly integrated, with the runtime providing the underlying infrastructure that enables the program to execute efficiently and concurrently.

然後最底層是Operating system, 程式碼會被編譯成machine code在OS執行。

在Scheduler和OS之間就有一個稱為Thread的構造。無論使用哪種OS,Thread都是OS用來管理其併發性的工具。當OS跟蹤同時發生的多個事情時,它們使用Thread來區分這些工作。












Scheduler的工作是將這些 goroutine(也稱為虛擬線程,這些線程純粹由我們的 Go program維護)映射到OS的thread上。然而,goroutine 有限制,因為它不直接與OS互動,所以它本身無法做任何事情。這就是Scheduler發揮作用的地方。Scheduler會將 goroutine 映射到OS的thread上。


 








goroutine跟thread差異

通常thread有固定的stack space, 約1mb

而goroutine的stack space是變動的, 起始大小為2kb

thread被os管理,goroutine被 Go runtime管理

thread比較消耗資源, goroutine相較起來較少



ps. go runtime簡介