筆記1:網絡編程

簡易理解網絡編程

1 相關概念認識

  • 網絡通信:萬維網通信使用,目的讓電腦上不同軟件之間通信。
  • IP地址:分爲IP4與IP6

1558531665591

1558531862924

  • IP地址分類:電腦唯一區分號

1558531941583

  • 端口號:同一個Ip下的不同程序的識別

1558532098004

  • 進程:運行的程序就叫做進程,知名端口0---1023,動態端口1024--65535。其中網站瀏覽默認端口80,ftp端口21
  • socket套接字:用來完成網絡通信必備的東西。
 
 
 
xxxxxxxxxx
 
 
 
 
# !/usr/bin/env python
# coding:utf-8
import socket
def handle_request(client):
    buf = client.recv(1024)
    client.send("HTTP/1.1 200 OK\r\n\r\n")
    client.send("Hello, World")
def main():
    # 創建socket對象,socket.AF_INET表示IP4, socket.SOCK_STREAM表示TCP通信
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('localhost',8080))# 綁定端口和ip,本機ip,與客戶端相同的端口號
    sock.listen(5) # 最大連接數
    while True:
        connection, address = sock.accept()
        handle_request(connection)
        connection.close()
if __name__ == '__main__':
  main()
 
 

 

1558536535562

  • 通信模型:UDP與TCP,udp可以理解成寫信模式,每封信都需要地址端口等,另外存在不安全性,數據可能丟失。TCP可以理解爲打電話的形式,相對就安全很多。TCP還具有超時重傳,錯誤校驗,流量控制和阻塞管理。
  • 下載文件

1558538940566

1558539531863

2 進程、線程與協程

2.1 多任務

 
 
 
xxxxxxxxxx
 
 
 
 
'''
多任務操作:我們希望兩個線程同時執行
'''
import time
import threading
# 唱歌
def sing():
    for i in range(5):
        print('正在唱歌===========>.......光輝歲月')
        time.sleep(1)
# 跳舞
def dance():
    for i in range(5):
        print('正在跳舞===========>.......新疆舞')
        time.sleep(1)
#---------------------------------非多線程操作-----------------------------
def main1():
    sing()
    dance()
#---------------------------------線程:多任務操作-----------------------------
def main2():
    t1 = threading.Thread(target=sing)
    t2 = threading.Thread(target=dance)
    t1.start()
    t2.start()
if __name__ == '__main__':
    # main1()
    main2()
 
 
  • 時間片輪轉:單核cpu處理多個應用程序,每個程序分配極少的時間如0.001s,輪換切換時間極短,人工難以區分,就誤以爲一起同時運行了。這裏只是完成多任務的一種策略。例子:單核CUP運行QQ,切換微信等
  • 並行:真正的多任務,每個程序一個內核cpu。例如:雙核CPU分別運行QQ與微信
  • 併發:假的多任務,cup核數量少於任務數。例如:單核CPU運行QQ與微信

2.2 線程

1558615616048

  • 紅色箭頭表示程序的線程,調用start方法時候,生成新的線程。這時候可以有兩個線程同時執行代碼,由此出現多任務的情況。

1558616261683

線程的封裝

1558616676609

  • 全局變量:如果指定固定值不加global,如果指的同一個地址不需要加

1558617333465

  • 線程傳參

1558618933329

  • 互斥鎖

1558619797729

 

  • 死鎖:銀行家算法

死鎖是一種狀態,在多任務中A任務在等待。B任務也在等待,。。。,N任務也在等待。就造成一種死鎖現象。都在等待解鎖,就造成阻塞,程序永遠卡住。爲了避免死鎖出現以下策略:

(1) 添加超時時間

(2)程序設計時要儘量避免(例如,銀行家算法)等

1558620232501

銀行家算法核心思想就是將現有的資源分配給多個任務,任務執行完解鎖,以此類推完成所有任務。

2.3 進程

  • exe就是二進制文件,就是一個靜態的程序。將這個程序運行起來就是進程了。程序只有一個,但是可以包含多個進程,一個進程可以包含多個線程。最簡單的理解,比如微信是一個程序,運行起來以後會使用語音、視頻、網絡、聲卡等功能,每個功能是一個進程。這樣看起來程序運行起來就包含多個進程了。進程是操作系統分配的單位。
  • 進程的狀態

1558622181248

進程也可以完成多任務,不過佔用資源比較大。線程可以完成多任務,佔用資源少。

  • 進程和線程對比

    • 進程是一堆資源的繼承,包括網絡,硬盤,聲卡等。進程是資源分配單位。一個進程裏面至少一個主線程。進程可以理解爲工廠上面的流水線,線程就是流水線上的工人。
    • 線程比較輕量級。線程執行開銷小,不利於資源管理和保護。進程相反。
  • 進程間的通信Queue:放數據put,取數據get,判空empty,判滿full

1558623951778

 

1558623999618

 

  • 進程通信案例,其中一個進程是網上下載數據,一個進程是分析數據。如果是線程可以通過全局變量共享數據。如果是進程需要引入通信queue的get和put讀寫數據達到共享。

    1558624351188

1558624444865

  • 進程池pool:對進程管理,join阻塞主進程,等待進程池裏面進程執行。進程池中如果有異常是不會在屏幕上打印的

1558624938788

2.4 協程

  • range與xrange的區別,前者基於迭代器返回的結果,佔用大量空間;後者返回可以迭代對象,什麼時候用什麼時候取。Python3經過改進後,將range改進近似xrange節約空間

  • 迭代器執行保存的結果,迭代器生成代碼next控制結果,具備yield標識有return的效果,而且運行速度快。

  • yield實現多任務

    1558627106338

  • pip安裝到python2裏面,pip3安裝到python裏面

  • greenlet是對yield的高端封裝,可以直接寫greenlet不用再添加yeild。通過switch切換函數

1558627329942

  • gevent異步併發庫,其採用協程方式。(推薦使用,yield和greenlet瞭解即可)

1558627761221

  • gevent圖片下載案例

1558628407603

2.5 進程、線程與協程的區別

  • 進程是資源分配單位,線程是操作系統調度單位
  • 進程切換需要很大的資源,效率低;線程切換資源一般效率一般
  • 協程切換任務資源很小,效率高
  • 多進程多線程根據cpu核數不同可能是併發,但是協程在一個線程中是併發

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章