笔记1:网络编程
簡易理解網絡編程
1 相關概念認識
- 網絡通信:萬維網通信使用,目的讓電腦上不同軟件之間通信。
- IP地址:分為IP4與IP6
- IP地址分類:電腦唯一區分號
- 端口號:同一個Ip下的不同程序的識別
- 進程:運行的程序就叫做進程,知名端口0---1023,動態端口1024--65535。其中網站瀏覽默認端口80,ftp端口21
- socket套接字:用來完成網絡通信必備的東西。
?
- 通信模型: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核數不同可能是并發,但是協程在一個線程中是并發
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/baiboy/p/11013089.html
總結
- 上一篇: 用复制mysql/data 文件夹 下面
- 下一篇: ural 1129 (求数据)