day26網路程式設計

weixin_33816300發表於2017-11-27

1.1.1ThreadLocal

#很類似於類中的呼叫私有方法

8777041-73375249aa2578ef.png

全域性變數local_school就是一個ThreadLocal物件,每個Thread對它都可以讀寫student屬性,但互不影響。你可以把local_school看成全域性變數,但每個屬性如local_school.student都是執行緒的區域性變數,可以任意讀寫而互不干擾,也不用管理鎖的問題,ThreadLocal內部會處理。


1.1.2非同步

8777041-54f03ffd7084637d.png
8777041-81316331857dc59c.png

1.1.3     GIL

在python的原始直譯器CPython中存在著GIL(Global Interpreter Lock,全域性直譯器鎖),因此在解釋執行python程式碼時,會產生互斥鎖來限制執行緒對共享資源的訪問,直到直譯器遇到I/O操作或者操作次數達到一定數目時才會釋放GIL。所以,雖然CPython的執行緒庫直接封裝了系統的原生執行緒,但CPython整體作為一個程式,同一時間只會有一個獲得GIL的執行緒在跑,其他執行緒則處於等待狀態。這就造成了即使在多核CPU中,多執行緒也只是做著分時切換而已。 不過muiltprocessing的出現,已經可以讓多程式的python程式碼編寫簡化到了類似多執行緒的程度了。

推薦網站:

http://developer.51cto.com/art/200910/156804.htm

解決GIL:

1、能用程式不用執行緒。

2、高效的程式碼使用c,c++來編寫

說明:

        單核的cup一個死迴圈執行緒或者程式,會佔滿這個cpu

        雙核的cpu兩個死迴圈執行緒,佔據兩個cpu都在50%左右,並不會佔滿,這樣降低了執行效率。

        雙核的cpu兩個死迴圈程式,佔滿兩個cpu的100%一個程式一個cpu,執行緒在程式裡面,程式裡面    可以有多個執行緒。


網路程式設計

UDP

·使用網路能夠把多方連結在一起,然後可以進行資料傳遞

·所謂的網路程式設計就是,讓在不同的電腦上的軟體能夠進行資料傳遞,即程式之間的通訊

UDP可以隨時傳送,沒有接收者也可以傳送。

1、tcp/ip簡介

作為新時代標杆的我們,已經離不開手機、離不開網路,對於網際網路大家可能耳熟能詳,但是計算機網路的出現比網際網路要早很多

2、TCP/IP協議(族)

早期的計算機網路,都是由各廠商自己規定一套協議,IBM、Apple和Microsoft都有各自的網路協議,互不相容

為了把全世界的所有不同型別的計算機都連線起來,就必須規定一套全球通用的協議,為了實現網際網路這個目標,網際網路協議簇(Internet Protocol Suite)就是通用協議標準。

因為網際網路協議包含了上百種協議標準,但是最重要的兩個協議是TCP和IP協議,所以,大家把網際網路的協議簡稱TCP/IP協議

8777041-72ab9ace6094c356.png
8777041-5579b16a2171818e.jpg

說明:

網際層也稱為:網路層

網路介面層也稱為:鏈路層

3、埠

如果一個程式需要收發網路資料,那麼就需要有這樣的埠

在linux系統中,埠可以有65536(2的16次方)個之多!

4、埠號

埠是通過埠號來標記的,埠號只有整數,範圍是從0到65535

埠號不是隨意使用的,而是按照一定的規定進行分配。

5、知名埠(Well Known Ports)

知名埠是眾所周知的埠號,範圍從0到1023,  系統已經佔用的埠號

eg:

80埠分配給HTTP服務

21埠分配給FTP服務

6、動態埠(Dynamic Ports)

動態埠的範圍是          從1024到65535

之所以稱為動態埠,是因為它一般不固定分配某種服務,而是動態分配。

動態分配是指當一個系統程式或應用程式程式需要網路通訊時,它向主機申請一個埠,主機從可用的埠號中分配一個供它使用。

當這個程式關閉時,同時也就釋放了所佔用的埠號。

7、怎樣檢視埠 ?

用“netstat-ano” “ps -aux”檢視埠狀態

8、小總結

埠有什麼用呢 ? 我們知道,一臺擁有IP地址的主機可以提供許多服務,比如HTTP(全球資訊網服務)、FTP(檔案傳輸)、SMTP(電子郵件)等,這些服務完全可以通過1個IP地址來實現。那麼,主機是怎樣區分不同的網路服務呢?顯然不能只靠IP地址,因為IP地址與網路服務的關係是一對多的關係。實際上是通過“IP地址+埠號”來區分不同的服務的。 需要注意的是,埠並不是一一對應的。比如你的電腦作為客戶機訪問一臺WWW伺服器時,WWW伺服器使用“80”埠與你的電腦通訊,但你的電腦則可能使用“3457”這樣的埠。

9、ip地址

1.什麼是地址

ip地址:用來在網路中標記一臺電腦的一串數字,比如192.168.1.1;在本地區域網上是唯一的。

2.ip地址的分類

每一個IP地址包括兩部分:網路地址和主機地址

1.1.1socket簡介  (套接字)

1、網路中程式之間如何通訊

首要解決的問題是如何唯一標識一個程式,否則通訊無從談起!

在本地可以通過程式PID來唯一標識一個程式,但是在網路中這是行不通的。

其實TCP/IP協議族已經幫我們解決了這個問題,網路層的“ip地址”可以唯一標識網路中的主機,

而傳輸層的“協議+埠”可以唯一標識主機中的應用程式(程式)。

這樣利用ip地址,協議,埠就可以標識網路的程式了,網路中的程式通訊就可以利用這個標誌與其它程式進行互動

3.什麼是socket

socket(簡稱套接字)是程式間通訊的一種方式,它與其他程式間通訊的一個主要不同是:

它能實現不同主機間的程式間通訊,我們網路上各種各樣的服務大多都是基於Socket來完成通訊的

例如我們每天瀏覽網頁、QQ聊天、收發email等等

4.建立socket

在Python中 使用socket模組的函式socket就可以完成:

socket.socket(AddressFamily, Type)  一般只用到這兩個引數。

說明:

函式socket.socket建立一個socket,返回該socket的描述符,該函式帶有兩個引數:

·Address Family:可以選擇AF_INET(用於Internet程式間通訊) 或者AF_UNIX(用於同一臺機器程式間通訊),實際工作中常用AF_INET

·Type:套接字型別,可以是SOCK_STREAM(流式套接字,主要用於TCP協議)或者SOCK_DGRAM(資料包套接字,主要用於UDP協議)

建立一個tcp socket(tcp套接字)

8777041-579104c3f850acc7.png

udp既可以當做傳送,又可以當做接受,還可以設定埠號,由傳送者設定。    

格式:物件.bind(assress,埠號)

8777041-f3bd75570a71a2ec.png

相關文章