亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

117 Python程序中的線程操作-開啟多線程

系統 1537 0

[TOC]

一、python線程模塊的選擇

Python提供了幾個用于多線程編程的模塊, 包括thread、threading和Queue等 。thread和threading模塊允許程序員創建和管理線程。thread模塊提供了基本的線程和鎖的支持,threading提供了更高級別、功能更強的線程管理的功能。Queue模塊允許用戶創建一個可以用于多個線程之間共享數據的隊列數據結構。

避免使用thread模塊,因為更高級別的threading模塊更為先進,對線程的支持更為完善,而且使用thread模塊里的屬性有可能會與threading出現沖突;其次低級別的thread模塊的同步原語很少(實際上只有一個),而threading模塊則有很多;再者,thread模塊中當主線程結束時,所有的線程都會被強制結束掉,沒有警告也不會有正常的清除工作, 至少threading模塊能確保重要的子線程退出后進程才退出 。

thread模塊不支持守護線程 ,當主線程退出時,所有的子線程不論它們是否還在工作,都會被強行退出。而threading模塊支持守護線程,守護線程一般是一個等待客戶請求的服務器,如果沒有客戶提出請求它就在那等著,如果設定一個線程為守護線程,就表示這個線程是不重要的,在進程退出的時候,不用等待這個線程退出。

二、threading模塊

multiprocess模塊的完全模仿了threading模塊的接口,二者在使用層面,有很大的相似性,因而不再詳細介紹(官方鏈接)

三、開啟子線程的兩種方式

線程的開啟和進程不同,進程是拷貝一份代碼去內存中執行。內部調用的是fork創建子進程

而線程是會去執行的指定函數

  1. 通過指定函數的方式
  2. 通過類的繼承,實現run方法

方式1:

          
            # 方式一
def task(name):
    print(f'{name} start')
    global x
    x -= 1
    print({name}, x)
    time.sleep(2)
    print(f'{name} end')


if __name__ == '__main__':
    x = 10
    t1 = Thread(target=task,args=("線程1",))
    t2 = Thread(target=task,args=("線程2",))
    t1.start()  # 告訴操作系統開一個線程
    t2.start()  # 告訴操作系統開一個線程

    print('主')

          
        

線程1 start {'線程1'} 9 線程2 start {'線程2'} 8 主 線程1 end 線程2 end

方式2

          
            # 方式二
class Mythread(Thread):
    def __init__(self,name):
        super().__init__()
        self.name = name

    def run(self):
        print(f'{self.name} start')
        global x
        x -= 1
        print({self.name}, x)
        time.sleep(2)
        print(f'{self.name} end')

if __name__ == '__main__':
    x = 10
    t1 = Mythread("線程1")
    t2 = Mythread("線程2")
    t1.start()
    t2.start()
    print('主')

          
        

線程1 start {'線程1'} 9 線程2 start {'線程2'} 8 主 線程1 end 線程2 end

通過上面兩組代碼你會發現:線程的創建運行比進程快,同一個進程中的線程可以共享資源

四、join回收子線程

和進程一樣,等待所以子線程結束然后去回收

          
            from threading import Thread
import time
'''
等待回收子線程
'''

def task():
    print('子線程 start')
    time.sleep(2)
    print('子線程 end')

t = Thread(target=task)
t.start()
t.join() # 等待子線程運行結束
print('主線程')

          
        

五、Thread類的其他方法

Thread實例對象的方法:

  • isAlive() :返回線程是否活動的。
  • getName() :返回線程名。
  • setName() :設置線程名。

threading模塊提供的一些方法:

  • threading.currentThread() :返回當前的線程變量。
  • threading.enumerate() :返回一個包含正在運行的線程的list。正在運行指線程啟動后、結束前,不包括啟動前和終止后的線程。
  • threading.activeCount() :返回正在運行的線程數量,與len(threading.enumerate())有相同的結果。
          
            from threading import Thread,currentThread,enumerate,activeCount
import time
'''
線程的其他用法:
    1.查看是否存在  is_alive()    # True or False
    2.獲取線程名    getName()     
    3.設置線程名    setName(name) 
    4.當前線程      currentThread()   需要從threading導入currentThread模塊
    5.活動線程總和  activeCount()     需要從threading導入activeCount模塊
    6.查看所有線程  enumerate()       需要從threading導入enumerate模塊
'''
def task():
    print('子線程 start')
    time.sleep(2)
    print('子線程 end')

if __name__ == '__main__':
    t1 = Thread(target=task)
    t2 = Thread(target=task)
    t1.start()
    t2.start()

    print("查看線程狀態,設置線程名,獲取線程名","-" * 50)
    print(t1.is_alive())  # 查看是否存在
    print(t2.is_alive())  # 查看是否存在
    t1.setName("子線程一")  # 設置線程1名字
    t2.setName("子線程二")  # 設置線程2名字
    print(t1.getName()) # 獲取線程名
    print(t2.getName()) # 獲取線程名


    print("查看當前線程","-" * 50)
    print(currentThread())      # 查看當前線程
    print(currentThread().name)  # 查看當前線程名
    print("查看所有線程","-"*50)
    print(activeCount())    # 查看存活線程個數
    print(enumerate())  # 查看所有線程
    print(len(enumerate())) # 查看所有線程個數

          
        

六、基于多線程實現socket多用戶間通訊

客戶端

          
            import socket
from threading import Thread

def task(conn,client_addr):
    # 通訊循環
    while 1:
        try:
            msg = conn.recv(1024)
            if not msg:
                break
            print(client_addr,"消息:",msg.decode("utf8"))
            msg = input("請輸入內容")
            conn.send(msg.encode("utf8"))
        except Exception as e:
            print(e)
            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(addr,"連接成功")
        t = Thread(target=task,args=(conn,addr))
        t.start()

          
        

客戶端

          
            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條評論
主站蜘蛛池模板: 毛片毛片毛片毛片毛片毛片毛片 | 久久精品视频播放 | 四虎1515hhwocw | 天天综合天天看夜夜添狠狠玩 | 久久午夜青青草原影院 | 亚洲精品美女视频 | 深夜福利影院在线观看 | 国内久久久久高清影视 | 超清中文乱码精品字幕在线观看 | 免费一级特黄视频 | 久久伊伊香蕉综合精品 | 91国内精品线免费播放 | 国产福利视精品永久免费 | 色噜噜中文网 | 在线欧美一级毛片免费观看 | 快射影院| 亚洲不卡一区二区三区在线 | 人人干人人模 | 免费一级毛片清高播放 | 国产亚洲精品一区二区在线播放 | 欧美激情精品久久久久久久九九九 | 国产成人精品视频一区二区不卡 | 欧美一级www片免费观看 | 在线视频精品一区 | 四虎网站1515hh四虎免费 | 日韩人成免费网站大片 | 久久久久综合中文字幕 | 亚洲黄区 | 成人国产精品一级毛片了 | 在线视频日韩精品 | 欧美另类网站 | 欧美肥婆xxxx欧美另类 | 老妇女性较大毛片 | 久久精品视频热 | 亚洲综合日韩在线亚洲欧美专区 | 伊人久久大香焦 | 亚洲精品www久久久久久久软件 | 九色精品视频在线观看 | 国产精品第二页在线播放 | 亚洲一区二区在线视频 | 欧美日韩一区二区高清免费视频 |