欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

123 Python程序中的線程操作-協程

系統 1613 0

目錄

  • 一、什么是協程
  • 二、為什么要有協程
  • 三、協程的優缺點
  • 四、如何實現協程
  • 五、Gevent模塊
    • 5.1 模塊的安裝
    • 5.2 用法介紹
    • 5.3 代碼實例
  • 六、gevent之應用

一、什么是協程

協程: 就是 單線程 實現并發

協程概念本質是程序員抽象出來的,是人為的控制通過程序的IO去進行切換任務的執行

并發:任務切換+保存狀態

二、為什么要有協程

自己控制切換要比操作系統切換快的多.降低了單個線程的io堵塞時間,也就是實現了單線程下效率最高.

三、協程的優缺點

  • 優點:

    自己控制切換要比操作系統切換快的多

  • 缺點:

    1. 需要自己要檢測所有的io,但凡有一個阻塞整體都跟著阻塞.
    2. 無法利用多核優勢.

四、如何實現協程

其實協程的本質就是在單線程下實現并發,也就是通過生成器 yield next 進行迭代生成器,實現切換任務和保存任務。

在Python中我們需要使用gevnet模塊來實現協程

五、Gevent模塊

Gevent 是一個第三方庫,可以輕松通過gevent實現并發同步或異步編程,在gevent中用到的主要模式是Greenlet,它是以C擴展模塊形式接入Python的輕量級協程。 Greenlet全部運行在主程序操作系統進程的內部,但它們被協作式地調度。

5.1 模塊的安裝

安裝: pip3 install gevent

5.2 用法介紹

g1=gevent.spawn(func,1,,2,3,x=4,y=5) :創建一個協程對象g1,spawn括號內第一個參數是函數名,如eat,后面可以有多個參數,可以是位置實參或關鍵字實參,都是傳給函數eat的

          
            g2=gevent.spawn(func2)
          
        

g1.join() :等待g1結束

g2.join() :等待g2結束

上述兩步合作一步: gevent.joinall([g1,g2])

g1.value :拿到func1的返回值

5.3 代碼實例

通過 from gevent import monkey;

monkey.patch_all() 去補丁,捕獲所以IO

from gevent import monkey;monkey.patch_all() 必須放到被打補丁者的前面,如time,socket模塊之前。

          
            import time
from gevent import monkey;monkey.patch_all()
'''打了一個補丁,它可以實現捕獲非gevent的所有io'''
import gevent

def eat():
    print('eat 1')
    time.sleep(2)
    # gevent.sleep(2)   # 可以這樣單獨捕捉阻塞,但是太麻煩,所以直接打補丁,捕捉運行期間的全部IO
    print('eat 2')
def play():
    print('play 1')
    # 瘋狂的計算呢沒有io
    time.sleep(3)
    # gevent.sleep(3)   # 可以這樣單獨捕捉阻塞,但是太麻煩,所以直接打補丁,捕捉運行期間的全部IO
    print('play 2')

'''
gevent實現協程的模塊,它可以捕獲單線程中的io并去切換任務
'''
if __name__ == '__main__':
    # 把本該串行的代碼通過協程完成單線程并行
    start = time.time()
    g1 = gevent.spawn(eat)      # 創建一個協程對象
    g2 = gevent.spawn(play)
    # g1.join() # 等待回收協程對象
    # g2.join()
    gevent.joinall([g1,g2])     # 把上面兩步并一步
    end = time.time()
    print(end-start)
          
        

六、gevent之應用

通過gevent實現單線程下的socket并發

注意: from gevent import monkey;monkey.patch_all()一定要放到導入socket模塊之前,否則gevent無法識別socket的阻塞。

服務器

          
            import socket
from gevent import monkey; monkey.patch_all()   # 打補丁
import gevent

'''
基于協程的socket通訊

協程:單線程下實現并發
'''

def connec_interface(conn,addr):
    while 1:
        try:
            data = conn.recv(1024)
            if not data:
                break
            print(f"來自{addr}的消息:",data.decode("utf8"))
            data = input(f"與{addr}聊天")
            conn.send(data.encode("utf8"))
        except:
            break


if __name__ == '__main__':
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server.bind(("127.0.0.1",8080))
    server.listen(5)

    while 1:
        print("等待連接。。。")
        conn,addr = server.accept()
        print("連接成功")
        gevent.spawn(connec_interface, conn, addr)  # 創建一個協程對象
          
        

客戶端

          
            import socket

client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(("127.0.0.1",8080))

while 1:
    msg = input("請輸入內容")
    client.send(msg.encode("utf8"))
    data = client.recv(1024)
    if not data:
        break
    print(data.decode("utf8"))
          
        

更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 色爱综合网 | 毛片久久| 国内色综合精品视频在线 | 国产精品自在线 | 色九九| 国产苐1页影院草草影院 | 极品白嫩无套视频在线播放张悠雨 | 国产精品视频播放 | 亚洲 中文 欧美 日韩 在线观看 | 在线成人免费观看视频 | 99激情视频 | 手机成人免费视频 | 伊人二本二区 | 免费一级在线 | 成人欧美日韩视频一区 | 国产色情A片国语露对白 | 日本亚洲精品色婷婷在线影院 | 成在线人免费视频一区二区三区 | 日本久久精品免视看国产成人 | 免费观看呢日本天堂视频 | 久久久午夜电影 | 精品欧美一区二区三区久久久 | 亚洲婷婷国产精品电影人久久 | 全日本爽视频在线 | 亚洲精品美女视频 | 国产日韩欧美在线观看不卡 | 国产精品久久久久久亚洲调教 | 久久久高清免费视频 | 久久久美女 | 亚洲精品网站日本xxxxxxx | 网站午夜 | 成a人v在线观看视频 | 91精品国产91久久久久久 | 免费黄色在线观看 | 国产欧美日韩亚洲精品区2345 | 国产超碰人人做人人爱 | 国产一级黄色网 | 国产噜噜噜 | 成人免费体验区福利云点播 | 澳门特级 片免费观看视频 久草最新在线 | 久久这里只精品国产99热 |