<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Fabric 源碼學(xué)習(xí):如何實(shí)現(xiàn)批量管理遠(yuǎn)程服務(wù)器?

          共 1907字,需瀏覽 4分鐘

           ·

          2020-03-16 23:21

          作者丨豌豆花下貓
          來(lái)源丨Python貓


          Fabric 2 是其最新的大版本,跟早前的 Fabric 1 有挺大的不同,更加好用了,但是沒(méi)填上的坑也挺多的……本文繼續(xù)來(lái)聊聊 Fabric,不過(guò)我不想再面面俱到了,而是專注于這一個(gè)話題:它是如何實(shí)現(xiàn)對(duì)批量服務(wù)器的串行/并發(fā)管理的?(友情提示:為了有更好的閱讀體驗(yàn),如果你還不了解 Fabric 的基礎(chǔ)用法,建議先閱讀前面的教程。)Fabric 通過(guò) Group 來(lái)組合多臺(tái)服務(wù)器。區(qū)別在于由 fabric.group.Group 基類(父類)派生出的兩個(gè)子類:
          • SerialGroup(*hosts, **kwargs):按串行方式執(zhí)行操作
          • ThreadingGroup(*hosts, **kwargs):按并發(fā)方式執(zhí)行操作
          下面先看看這個(gè)基類:0fa4df85982bb3e411800b3d68be9789.webp我把一些沒(méi)用的信息折疊了,比較值得注意的內(nèi)容有:
          • Group 繼承了 list,所以能夠 extend() ,對(duì)傳入的服務(wù)器分別建立 connection
          • 核心的 run() 方法沒(méi)有寫(xiě)實(shí)現(xiàn),用意是留給子類再實(shí)現(xiàn)
          • 最后的 __enter__() 和 __exit__() 實(shí)現(xiàn)了上下文管理器
          有了這個(gè)基類,接下來(lái)就要看 SerialGroup 和 ThreadingGroup 的具體實(shí)現(xiàn)了。52c5cae76b622a1e04df9af512bd33c1.webpSerialGroup 類很簡(jiǎn)單,只實(shí)現(xiàn)了一個(gè) run() 方法。因?yàn)轭愒诔跏蓟瘯r(shí)為所有 host 建立了連接而且存了起來(lái),所以這里只需用 for 循環(huán)依次取出,再執(zhí)行 Connection 的 run() 方法。這里可以看到一種非常實(shí)用的開(kāi)發(fā)技巧:創(chuàng)建類時(shí),讓它繼承內(nèi)置的數(shù)據(jù)結(jié)構(gòu)(如 list、dict), 這樣可以直接使用 ?self.append()、self.extend()、self.update() 等方法把關(guān)鍵的信息存到“自身”,再到取出時(shí)則“for xxx in self”,這樣就免了創(chuàng)建臨時(shí)的 list 或 dict,也免得要在參數(shù)中傳來(lái)傳去。GroupResult 和 GroupException 是對(duì)執(zhí)行結(jié)果和異常的處理,不是我們關(guān)注的重點(diǎn),這里略過(guò)。接下來(lái)看看 ThreadingGroup,它也只有一個(gè) run() 方法:20dc1fedcf1bf1e0d82e663a79929404.webpExceptionHandlingThread 是一個(gè)繼承了 threading.Thread 的類,這是一種創(chuàng)建多線程的方式。每個(gè)線程執(zhí)行的方法主要做兩件事:執(zhí)行 connection 的 run() 方法,以及將執(zhí)行成功的結(jié)果存入隊(duì)列中。c7a134adb738494b199a6b7871096b19.webp接下來(lái)再分別把執(zhí)行成功的結(jié)果與出異常的結(jié)果都存入到 results 中。所以,F(xiàn)abric 是使用了 threading 多線程的方式來(lái)實(shí)現(xiàn)并發(fā)。網(wǎng)絡(luò)請(qǐng)求是 IO 密集型的,使用多線程是不錯(cuò)的方式。至此,對(duì)于我們?cè)陂_(kāi)頭提的問(wèn)題,就有了一個(gè)初步的答案:Fabric 封裝了兩種 Group 來(lái)批量管理服務(wù)器,其中串行方式就是用了簡(jiǎn)單的 for 循環(huán),而并發(fā)方式使用了 threading 多線程方式。但是,通過(guò)分析這兩種 Group 的實(shí)現(xiàn)代碼(以及使用的實(shí)踐),我們也可以發(fā)現(xiàn) Fabric 的缺陷:
          • Group 只實(shí)現(xiàn)了 run() 方法,但是 Connection 的 put()、get()、sudo() 等方法都沒(méi)有,這意味著用這種方式管理服務(wù)器集群時(shí),只能在上面執(zhí)行 shell 命令……
          • 每次調(diào)用 run() 方法時(shí),它要等所有主機(jī)都執(zhí)行完,才會(huì)返回結(jié)果,這意味著先執(zhí)行完的主機(jī)會(huì)被阻塞。更為致命的是,如果其中一臺(tái)主機(jī)執(zhí)行時(shí)出了異常,整個(gè) run() 方法就拋異常,這意味著每次使用 run() 方法時(shí),都需要作異常捕獲
          • run() 方法支持執(zhí)行單條 shell 命令,但是命令的狀態(tài)不會(huì)傳遞。假設(shè)先在一個(gè) run() 方法中運(yùn)行 cd 命令切到 A 目錄(非根目錄),再在下一個(gè) run() 方法創(chuàng)建一個(gè)文件,最終結(jié)果是該文件并不在 A 目錄,而是在默認(rèn)目錄。解決辦法是用“&&”連接起多條命令,略顯麻煩
          這幾個(gè)問(wèn)題在 Fabric 的 Github issue 中,被不同的人反復(fù)提出,但是還沒(méi)有得到很好的回應(yīng)……言歸正傳,本文主要分析了 Fabric 在批量管理服務(wù)器時(shí)的實(shí)現(xiàn)方案,閱讀其源碼,可以了解到串行/并發(fā)典型場(chǎng)景的用法,以及類定義、類繼承、多線程、異常處理等內(nèi)容,最后,我們還揭示出了它的幾個(gè)特性缺陷。

          060b25377f8ac7e1bb5198e7524700c2.webp

          近期精彩內(nèi)容推薦:??

          c39bd2fce0c698c271052ed6bdf4549c.webp?乎高贊:高考700分和700萬(wàn)怎么選?

          c39bd2fce0c698c271052ed6bdf4549c.webp?Python這五個(gè)坑,怎么避開(kāi)?

          c39bd2fce0c698c271052ed6bdf4549c.webp?賊好用的Java工具類庫(kù),GitHub星標(biāo)10k+

          c39bd2fce0c698c271052ed6bdf4549c.webp?“新冠牌”啤酒真倒60天賠了20個(gè)億




          9ab62564cee51c86ab6da999d7dc08b4.webp

          在看點(diǎn)這里a570bf6459eb7cfdf78666f81ab89e81.webp好文分享給更多人↓↓

          瀏覽 49
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  美性中文成人娱乐网 | 亚洲日韩网站在线观看 | 久久伊人国产一区 | 青青草小视频 | 亚洲乱伦第一页 |