使用執行緒改進聊天器

2021-09-29 03:21:23 字數 2115 閱讀 6211

執行緒是多工的一種形式,之前有介紹到基本的網路udp協議構建了乙個聊天器,但是聊天器不能再接收的同時傳送訊息,所以這裡應用執行緒對聊天器進行改進

執行緒是多工的一種形式,實現多工我們的策略實際叫做時間片輪轉,想象有兩個程序要同時執行,卻只有乙個cpu,普通的程式是將乙個程序或函式在cpu執行完畢後再執行另乙個。而時間片輪轉則是將乙個程序在cpu執行一段時間後(未完成)取出,執行另乙個程序,兩者以很快的速度交替執行,在巨集觀上看,我們就覺得像是同時執行了。這種方式也叫做併發。

而所謂並行,則是由多個(雙核、四核)cpu執行不同的程序,這是真正意義上的多工。

要實現執行緒多工我們就要用刀threading,threading 會在定義的瞬間衍生出乙個子執行緒去執行你所指定的函式,多個子執行緒就可以形成時間片輪轉了

定義乙個threading物件:target是目標函式,args傳入的引數是執行該函式需要用到的引數

t1=threading.thread(target=send,args=

(udp,send_ip,send_port)

)

開始執行緒:

t1.start(

)

全**:

import socket

import threading

defsend

(udp,send_ip,send_port)

:while

true

: masage=

input

("please input your masage(close can shutdown): "

)if masage==

"close"

:break

udp.sendto(masage.encode(

"utf-8"),

(send_ip,send_port)

) exit(

)def

rec(udp)

:while

true

: masage=udp.recvfrom(

1024

)print

(masage[1]

,": "

,masage[0]

.decode(

"utf-8"))

defmain()

: udp=socket.socket(socket.af_inet,socket.sock_dgram)

udp.bind((""

,4399))

send_ip=

input

("請輸入對方ip"

) send_port=

int(

input

("請輸入對方埠"))

t1=threading.thread(target=send,args=

(udp,send_ip,send_port)

) t2=threading.thread(target=rec,args=

(udp,))

t1.start(

) t2.start(

)if __name__ ==

'__main__'

: main(

)

多執行緒也會帶來一定的問題,比如資源競爭,由於全域性變數在各個執行緒裡面都是共享的,變數在乙個程序改變,則在另乙個程序裡面也會改變。想象兩個程序,都對num=0的全域性變數進行加一,則在迴圈n次後num=2*n,然而實際情況則是遠遠小於這個值。這就是發生了資源競爭,比如num=0,在乙個程序實現+1之前退出,執行另乙個程序,則此時num=0,但另乙個程序理應在num=1的基礎上+1,此時則造成了錯誤。

解決資源競爭可以採用互斥鎖

mutex=threading.lock()預設未上鎖

.acquire()上鎖

.release()解鎖

對程序上鎖,如果兩個程序上了鎖,那麼在時間片輪轉中先執行的程序先上鎖,當交換到另乙個程式執行,由於鎖被另乙個程序上了,還未解鎖(程序未執行完),所以在此處阻塞,直到另乙個程序執行完成並解鎖。

當然上鎖策略也會造成死鎖,這時候就需要運用銀行家演算法對鎖的情況做乙個很機巧的安排了

python使用多執行緒實現UDP聊天器

import socket import threading defsend msg udp socket,dest ip,dest port 傳送資料 while true send data input 請輸入要傳送的資料 udp socket.sendto send data.encode u...

tcp 多執行緒聊天器

from socket import import threading from time import sleep def main sever 建立套接字 tcp socket socket af inet,sock stream 繫結本地資訊 tcp socket.bind 8081 監聽 t...

linux 多執行緒聊天伺服器

自己寫的linux多執行緒聊天伺服器,可以實現併發,通過鍊錶新增人數。include include include include include include include include include include include typedef struct client typed...