<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國際加速解決方案。 廣告
                [toc] ## 功能說明 gevent是greenlet模塊的高級封裝,greenlet可以實現根據用戶自己的需要在單個線程的多個任務中進行任務切換,所以gevent封裝了這個功能后,加入了對IO的判斷,做到了在發現IO的情況下,自動切換任務的功能 所以我們先來了解greenlet模塊的功能,后學習gevent的協程功能. * 安裝greenlet :pip3 install greenlet * 安裝gevent:pip3 install gevent ## greenlet模塊 在單個線程內有多個任務,使用greenlet模塊可以非常簡單地實現任務直接的切換 但單純的切換反而會降低程序的執行速度 ~~~ from greenlet import greenlet def eat(n): for i in range(3): print('%s is eat...%s'%(n,i)) g2.switch('noah') def play(n): for i in range(3): print('%s is paly...%s'%(n,i)) g1.switch() if __name__ == '__main__': g1=greenlet(eat) g2=greenlet(play) g1.switch('noah') #在第一次switch時傳入參數,以后都不需要 ~~~ 執行結果: ``` noah is eat...0 noah is paly...0 noah is eat...1 noah is paly...1 noah is eat...2 noah is paly...2 ``` greenlet只是提供了一種便捷的切換方式,仍然是沒有解決遇到IO自動切換來提升效率的問題。 ## gevent模塊 gevent 是一個第三方庫,可以輕松通過gevent實現并發同步或異步編程,在gevent中用到的主要模式是**Greenlet**, 它是以C擴展模塊形式接入Python的輕量級協程。 Greenlet全部運行在主程序操作系統進程的內部,但它們被協作式地調度。 **遇到IO阻塞時會自動切換任務** ### 用法 * g1=gevent.spawn(func,1,2,3,x=4,y=5) 創建一個協程對象g1,第一個參數是函數名,其他參數是位置實參或關鍵字實參 * g1.join() 等待g1對象結束 * gevent.joinall([g1,g2]) 等待多個協程對象介紹 * g1.value 拿到func1的返回值 ### 普通的用法案例1 ~~~ import gevent def eat(n): for i in range(3): print('%s is eat...%s'%(n,i)) gevent.sleep(0.5) def play(n): for i in range(3): print('%s is play...%s'%(n,i)) gevent.sleep(0.5) if __name__ == '__main__': g1=gevent.spawn(eat,'noah') g2=gevent.spawn(play,'bobo') gevent.joinall([g1,g2]) print('主...') # 執行結果: noah is eat...0 bobo is play...0 noah is eat...1 bobo is play...1 noah is eat...2 bobo is play...2 主... ~~~ >gevent.sleep(2)模擬的是gevent可以識別的io阻塞,其他模塊如time模塊中的io他是不能識別的 ### **打補丁和代碼案例** 如果要讓gevent識別所有的IO,就需要在文件的開頭寫上下面的代碼(打補丁) `from gevent import monkey;monkey.patch_all()` **代碼案例1:time模擬IO** ~~~ from gevent import monkey;monkey.patch_all() import gevent,time def eat(n): for i in range(3): print('%s is eat...%s'%(n,i)) time.sleep(0.5) def play(n): for i in range(3): print('%s is play...%s'%(n,i)) time.sleep(0.5) if __name__ == '__main__': g1=gevent.spawn(eat,'noah') g2=gevent.spawn(play,'bobo') gevent.joinall([g1,g2]) print('主...') #執行結果: noah is eat...0 bobo is play...0 noah is eat...1 bobo is play...1 noah is eat...2 bobo is play...2 主... ~~~ >用threading.current_thread().getName()來查看每個g1和g2 >查看的結果為**DummyThread-n**,即假線程 **代碼案例2:協程socket并發** 這是服務端代碼,客戶端代碼略 ~~~ from gevent import monkey;monkey.patch_all() import gevent,socket def ser(): server=socket.socket() server.bind(('127.0.0.1',8800)) server.listen() while True: conn,addr=server.accept() gevent.spawn(talk,conn,addr) def talk(conn,addr): try: while True: res=conn.recv(1024) if not res:continue print(res) conn.send(res.upper()) except Exception as e: print(e) if __name__ == '__main__': ser() ~~~
                  <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>

                              哎呀哎呀视频在线观看