如何控制python多線程的退出?

先說一下實際情況,我開了兩個線程,線程一有結束標誌,線程二是一個死循環,我要怎麼才能讓程序在線程一運行結束之後使得主程序(包括線程二)完全退出。代碼寫的很渣,就不拿出來獻醜了


實名反對黃哥的說法,請看準題主問什麼再答題,寫個專欄也請多放點心思在準確性上,用不著因為在評論里指出點錯誤就屏蔽,沒人搶這飯碗。

回題主的問題

一般來說,多線程模式下,建議主線程只處理線程本身的調度,不去處理具體業務。通常在創建線程後,join等待所有線程退出。

就題主的問題,可以創建線程一、二之後,主線程等待線程一退出,之後用sys.exit退出。

但是,線程二死循環的做法不是好習慣,用系統退出的方式,很可能造成循環內部的事務中斷,建議改成條件循環,檢查某個對象的數據,滿足後退出循環。

這樣,可以在主線程等待線程一、線程二退出,保證事務完整性。


線程二 設置成守護線程即可。

t2.setDaemon(True)


哈哈哈哈,剛寫了一個多進程的迴音伺服器

# 伺服器代碼

# 伺服器代碼
import socket
import threading

class tcp_server(object):
def __init__(self):
self.tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.tcp_socket.bind(("", 8001))
self.tcp_socket.listen(250)
self.proceses = []

def run_forver(self):
while True:
new_socket, new_addr = self.tcp_socket.accept()
threads = threading.Thread(target=self.service_clinet, args=(new_socket, new_addr))
threads.start()

# 此處不應該關閉, 因為Python3規則是 線程任務運行完,自動回收該線程
# new_socket.close()
# threads.join()

def service_clinet(self, new_socket, new_addr):
while True:
data = new_socket.recv(1024)
if not data:
# 伺服器收不到客戶端的消息,跳出循環,關閉new_socket, 結束此進程
print(new_addr, "已斷開鏈接")
new_socket.close()
break
print("%s 發來消息 %s" % (new_addr, data.decode()))

new_socket.send(data)

def main():
s = tcp_server()
s.run_forver()

if __name__ == "__main__":
main()

下面是客戶端代碼

# 客戶端代碼
import socket

def tcp_cline():
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_socket.connect(("127.0.0.1", 8001))

while True:
d = input("輸入消息")
tcp_socket.send(d.encode())

data = tcp_socket.recv(1024)
if not data:
break
print(" from cline %s" % data.decode())

tcp_socket.close()

if __name__ == "__main__":
tcp_cline()


推薦閱讀:

為什麼黑暗之魂3創建了一個新角色之後存檔尺寸沒有發生變化?
Haskell有哪些提高效率的技巧?
哪款滑鼠非常適合編程寫代碼?
將一副撲克(去掉大小王)圍成一圈,使每相鄰四張的和均為 28。若無解,如何證明?
Unity3d 與 C#線程的坑處?

TAG:Python | 編程 | 多線程 |