簡易理解網絡編程
1 相關概念認識
- 網絡通信:萬維網通信使用,目的讓電腦上不同軟件之間通信。
- IP地址:分爲IP4與IP6
- IP地址分類:電腦唯一區分號
- 端口號:同一個Ip下的不同程序的識別
- 進程:運行的程序就叫做進程,知名端口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()
- 通信模型:UDP與TCP,udp可以理解成寫信模式,每封信都需要地址端口等,另外存在不安全性,數據可能丟失。TCP可以理解爲打電話的形式,相對就安全很多。TCP還具有超時重傳,錯誤校驗,流量控制和阻塞管理。
- 下載文件
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 線程
- 紅色箭頭表示程序的線程,調用start方法時候,生成新的線程。這時候可以有兩個線程同時執行代碼,由此出現多任務的情況。
線程的封裝
- 全局變量:如果指定固定值不加global,如果指的同一個地址不需要加
- 線程傳參
- 互斥鎖
- 死鎖:銀行家算法
死鎖是一種狀態,在多任務中A任務在等待。B任務也在等待,。。。,N任務也在等待。就造成一種死鎖現象。都在等待解鎖,就造成阻塞,程序永遠卡住。爲了避免死鎖出現以下策略:
(1) 添加超時時間
(2)程序設計時要儘量避免(例如,銀行家算法)等
銀行家算法核心思想就是將現有的資源分配給多個任務,任務執行完解鎖,以此類推完成所有任務。
2.3 進程
- exe就是二進制文件,就是一個靜態的程序。將這個程序運行起來就是進程了。程序只有一個,但是可以包含多個進程,一個進程可以包含多個線程。最簡單的理解,比如微信是一個程序,運行起來以後會使用語音、視頻、網絡、聲卡等功能,每個功能是一個進程。這樣看起來程序運行起來就包含多個進程了。進程是操作系統分配的單位。
- 進程的狀態
進程也可以完成多任務,不過佔用資源比較大。線程可以完成多任務,佔用資源少。
-
進程和線程對比
- 進程是一堆資源的繼承,包括網絡,硬盤,聲卡等。進程是資源分配單位。一個進程裏面至少一個主線程。進程可以理解爲工廠上面的流水線,線程就是流水線上的工人。
- 線程比較輕量級。線程執行開銷小,不利於資源管理和保護。進程相反。
-
進程間的通信Queue:放數據put,取數據get,判空empty,判滿full
-
進程通信案例,其中一個進程是網上下載數據,一個進程是分析數據。如果是線程可以通過全局變量共享數據。如果是進程需要引入通信queue的get和put讀寫數據達到共享。
- 進程池pool:對進程管理,join阻塞主進程,等待進程池裏面進程執行。進程池中如果有異常是不會在屏幕上打印的
2.4 協程
-
range與xrange的區別,前者基於迭代器返回的結果,佔用大量空間;後者返回可以迭代對象,什麼時候用什麼時候取。Python3經過改進後,將range改進近似xrange節約空間
-
迭代器執行保存的結果,迭代器生成代碼next控制結果,具備yield標識有return的效果,而且運行速度快。
-
yield實現多任務
-
pip安裝到python2裏面,pip3安裝到python裏面
-
greenlet是對yield的高端封裝,可以直接寫greenlet不用再添加yeild。通過switch切換函數
- gevent異步併發庫,其採用協程方式。(推薦使用,yield和greenlet瞭解即可)
- gevent圖片下載案例
2.5 進程、線程與協程的區別
- 進程是資源分配單位,線程是操作系統調度單位
- 進程切換需要很大的資源,效率低;線程切換資源一般效率一般
- 協程切換任務資源很小,效率高
- 多進程多線程根據cpu核數不同可能是併發,但是協程在一個線程中是併發