<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                1、Wild Ones 提問: 你好,大牛,golang后端開發需要掌握哪些知識和技術?有沒有一些開源項目推薦? 回答: 除了語言本身,看具體哪個領域。如果使用 Go 進行 Web 開發,普通工程師的話,至少需要掌握:HTTP協議、Linux、Web Server、數據庫如MySQL、Redis緩存等。這是最基本的要求。其他比如高可用、分布式方案等,可以后續慢慢涉獵。 Go 的開源項目的話,可以根據上面的,設計不同方面。看你目的是什么。 2、暗香去 提問: 相對于java,Go擁有著超高并發能力,那么Go是如何解決IO等待問題的? 回答: 借此問題,普及一下 IO 的相關知識點。 IO 基本概念 Linux 的內核將所有外部設備都可以看做一個文件來操作(Unix 的設計原則,一切皆文件)。那么我們對外部設備的操作都可以看做對文件進行操作。我們對一個文件的讀寫,都通過調用內核提供的系統調用;內核給我們返回一個 file descriptor(fd,文件描述符)。對一個 socket 的讀寫也會有相應的描述符,稱為socketfd(socket 描述符)。描述符就是一個數字(可以理解為一個索引),指向內核中一個結構體(文件路徑,數據區,等一些屬性)。應用程序對文件的讀寫就通過對描述符的讀寫完成。 一個基本的 IO,它會涉及到兩個系統對象,一個是調用這個 IO 的進程對象,另一個就是系統內核(kernel)。 一般來說,服務器端的 I/O 主要有兩種情況:一是來自網絡的 I/O;二是對文件(設備)的I/O。 常見的 IO 模型 首先一個 IO 操作其實分成了兩個步驟:發起 IO 請求(等待網絡數據到達網卡并讀取到內核緩沖區,數據準備好)和實際的 IO 操作(從內核緩沖區復制數據到進程空間)。 阻塞和非阻塞 阻塞 IO 和非阻塞 IO 的區別在于第一步:發起 IO 請求是否會被阻塞。如果阻塞直到完成,那么就是傳統的阻塞 IO,如果不阻塞,那么就是非阻塞 IO。 同步和異步 同步 IO 和異步 IO 的區別就在于第二個步驟是否阻塞。如果實際的 IO 讀寫阻塞請求進程,那么就是同步IO。因此常說的阻塞 IO、非阻塞 IO、IO 復用、信號驅動 IO 都是同步 IO。如果不阻塞,而是操作系統幫你做完 IO 操作后再將結果返回給你(通知你),那么就是異步IO。 IO 多路復用 指內核一旦發現進程指定的一個或者多個IO條件準備讀取,它就通知該進程。 目前支持 I/O 多路復用的常用系統調用有 select,pselect,poll,epoll 等,I/O 多路復用就是通過一種機制,一個進程可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程序進行相應的讀寫操作。但 select,pselect,poll,epoll本質上都是同步 I/O,因為他們都需要在讀寫事件就緒后自己負責進行讀寫,也就是說這個讀寫過程是阻塞的,而異步 I/O 則無需自己負責進行讀寫,異步 I/O 的實現會負責把數據從內核拷貝到用戶空間。 5 種 IO 模型 《UNIX 網絡編程》對 IO 模型進行了總結,分別是: 阻塞 IO、非阻塞 IO、IO 多路復用、信號驅動的 IO、異步 IO;前 4 種為同步 IO,只有異步 IO 模型是異步 IO。 回到問題 目前很多高性能的基礎網絡服務器都是采用的 C 語言開發的,比如:Nginx、Redis、memcached 等,它們都是基于”事件驅動 + 事件回調函數”的方式實現,也就是采用 epoll 等作為網絡收發數據包的核心驅動。但不少人都認為“事件驅動 + 事件回調函數”的編程方法是“反人類”的;因為大多數人都更習慣線性的處理一件事情:做完第一件事情再做第二件事情,并不習慣在 N 件事情之間頻繁的切換干活。為了解決程序員在開發服務器時需要自己的大腦不斷的“上下文切換”的問題,Go 語言引入了一種用戶態線程 goroutine 來取代編寫異步的事件回調函數,從而重新回歸到多線程并發模型的線性、同步的編程方式上。 在 Linux 上 Go 語言寫的網絡服務器也是采用的 epoll 作為最底層的數據收發驅動,Go 語言網絡的底層實現中同樣存在“上下文切換”的工作,只是這個切換工作由 runtime 的調度器來做了,減少了程序員的負擔。 所以,IO 等待是必然,只是誰等的問題。Go 語言在遇到 IO 需要等待時,runtime 會進行調度,語言層面處理這個問題。Go 擁有超高并發能力的關鍵就在于用戶態的 goroutine。 注:網絡編程,涉及到太多知識點,咱們后面可以找時間慢慢聊。 3、 提問: go int32和uint32區別,和使用的場景, 回答:int32 是有符號類型;uint32 是無符號類型。有符號和無符號的概念知道吧。 一般的項目,直接使用 int 即可;有一些對內存要求很高的場景,希望每個變量都盡可能做到夠用不超。比如,我們存一個數字,它不會是負數,同時最大值不會超過 1<<32 - 1,那么就可以使用 uint32。 在 32 位機器上,int 和 int32 占用空間和表示的范圍是一樣的。 3、想問一下,對Chan類型的變量,什么時候用select,什么時候用for range 回答: 多個chan用select,單個用for range
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看