網絡通訊學習

~當前用戶的家目錄python

-r 是用來刪除目錄的
Ctrl + L 清屏 等於 clear命令
凡是木錄 目錄名後都跟上/
cd .. 切換到當前目錄的上一級目錄
cd . 原地踏步,切換到當前目錄
cd ~切換到當前用戶家目錄 與 cd做用同樣 cd~ == cd
cp 文件路徑 文件名 目的路徑 mv 與cp用法同樣可是隻有一份文件
nginx

bit--8-->Byte--1024-->KB--1024-->MB-->.....c'dweb

選項 -p 再建立嵌套目錄的時候使用 表示自動建立父目錄(parents)vim

-v 在cp中複製文件時使用 用來顯示copy的路徑
-i 在刪除時提醒是否要刪除
cat 文件名 直接顯示所有內容
more 文件名 只顯示一屏,餘下的摺疊起來顯示已經顯示的量
touch 建立已經存在的文件就能夠更改文件的最後修改時間瀏覽器


重定向 把本應該輸出在終端的結果輸出到其它位置 (文件中)
command > 文件名 每次都覆蓋之前的內容
command >> 文件名 把內容追加到以前文件內容的後面
cat 多個文件名 >> 文件名 把多個文件的內容合併到一個文件中輸出到終端上(>>後跟一個新文件名能夠建立這個文件)安全


管道 command1 | command2 把command1的輸出看成輸入給command2 |-->管道鏈接符服務器

history 顯示歷史命令網絡


連接文件ln
ln -s 軟鏈接的名字 () 軟鏈接相似於Windows的快捷方式
ln 原文件名 硬連接文件名 (和源文件同樣大小,就是源文件的另外一個名字)ls -i 那個數字就是硬連接數量多線程

間接地訪問或者修改源文件
軟鏈接能夠跨分區,鏈接目錄.
跨目錄建立連接須要指定絕對路徑併發


grep 搜索文件中的內容
在文件中搜索想要查找的字符串
grep [選項] '要搜索的字符串' 文件名
-n顯示匹配及行號
-i忽略大小寫
-v求反
正則
^? 以什麼開始
?$ 以什麼結束
?[xy] ?x或者?y
x.y 匹配三個字符 .能夠是出/n外的任意字母


find 查找文件
find 要查找的目錄/ -name '文件名'
?匹配一個任意字符
*匹配任意字符
[xy]匹配兩個不一樣的字符

tar 歸檔
打包 默認不壓縮
tar -cvf xxx.tar 須要打包的文件名1234..
-c建立打包文件

打包壓縮gzip
tar -zcvf xxx.zip 須要打包壓縮的文件名1234..

解包
tar -xvf 包文件名

解壓縮解包
tar -zxvf 打包壓縮文件名

bzip2壓縮
tar -jcvf 打包壓縮文件名 須要打包壓縮文件名 (打包而且壓縮)

bzip2解壓縮解包
tar -jxvf 須要解壓縮解包的文件
-C 後面跟路徑 表示解壓縮到哪

zip壓縮
zip 文件名
解壓zip
unzip -d 須要解壓的壓縮文件菜單

修改文件權限
rw-rw-r--
rw- rw- r--
文件所屬用戶 同組用戶的權限 訪客的權限
user - u group - g other - o a - all 全部用戶
字母法
chmod 用戶名+/-/=權限 文件名
[augo] 全部人
數字法
r4 w2 x1 -0
chmod 777 文件名 -->全部與用戶都是rwx

sudo 命令 以root用戶的權限執行命令
安裝軟件須要使用sudo

password
設置用戶密碼

which 文件名
查看文件所在位置

exit退出當前用戶

SSH 加密遠程登錄
用戶端和服務器端都須要的裝SSH服務
ssh 用戶名@IP地址

軟件安裝
sudo apt-get install 軟件
卸載軟件
suo apt-get remove 軟件
離線安裝
sudo dpkg -i 軟件


vim
命令模式 輸入指令
插入模式 i 進入輸入模式 esc退出到命令模式 ZZ保存退出!
末行模式 :wq :x保存並退出 :q!強制退出不保存

在命令模式下:a在光標後面 i在光標前面 I在行首 A在行末 O在光標行的上一行新開一行 o在光標所在行的下一行新開一行
G光標到末行 gg光標到首行
行數yy 複製多行 x刪除光標後字符 X刪除光標前 行數dd剪切 p粘貼 u撤銷 ctrl r反撤銷 >>縮進 <<縮前 v選中須要操做的行進行操做
r 替換當前字符 R替換光標後的字符 %s/須要替換的數據/新數據/g-所有替換

-----------------------------------------------------------------------------------------------------
ip地址的做用
用以計算機之間的網絡通訊 標識收發雙方的身份
ipv4 點分式 網絡號.主機號
ipv6 將來發展趨勢,中國很迫切
127.0.0.1 本地環回 測試本機網絡功能是否正常 表示本機系統
修改網卡的ip地址 sudo ifconfig ens33 ip(0,1,255有特殊用途不能使用!)

ping ip/域名 測試本機與遠程計算機的網絡是否正常通暢

端口 標識計算機系統中的一個應用程序
知名端口 0-1023 http 80 ssh 22 https 443 程序要使用著名端口須要root權限
動態端口 隨機分配,動態變化

netstat -an|grep ":端口號" 查看端口的佔用狀況
sudo lsof -i ":端口號" 查看佔用端口的程序
-----------------------------------------------------------------------------------------------------
socket 套接字(網絡插座) 封裝了網絡通訊功能 對用戶提供接口
網絡通訊都是套接字

套接字有不一樣的方式UDP TCP等
UDP 用戶數據報協議-->無鏈接不可靠-->發送端無需確認接收端能夠直接發送數據-可能致使丟包 基於數據報 如發短信


import socket

#1 建立udp套接字 模塊名 類名 ipv4 udp的縮寫
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

#2 設置接受方的ip和端口
accept_address = ("192.168.18.32", 8080)

#3 使用sendto關鍵字發送 內容 ip和端口
udp_socket.sendto("噠嘎好! 我係苦天落!".encode("utf8"), accept_address)

#4 關閉套接字
udp_socket.close()

解碼的格式和編碼的格式必須一致

發送並接受數據
import socket
# 建立套接字
udp_soct = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

udp_soct.sendto("哈哈v".encode(), ("192.168.18.32", 8080))
# 接收數據
recv_data, send_address = udp_soct.recvfrom(1024) # 這個參數表示每次接受的字節數
print("發送者是: %s 內容是: %s" % (str(send_address), recv_data.decode("gbk")))
# 關閉套接字
udp_soct.close()

綁定端口號
套接字名.bind("ip", port) ip爲空的話就表示綁定本機全部ip
在使用套接字以前綁定
爲程序持續服務,容易被他人發現

python的module模塊文件和source源文件
源文件名是文件名就行
模塊名須要知足標識符命名規則

UDP廣播
ip地址後有255就是廣播地址

----------------------------------------------------------------------------------------------------
Tcp網絡通訊
面向鏈接
創建鏈接- 數據通訊-關閉鏈接

可靠傳輸
應答機制 ack(應答)
超時重傳 在發送方有一個定時器
錯誤校驗 CRC循環冗餘校驗
擁塞控制 發送方根據實時狀況 動態調整決定發送數據的速度

基於字節流(最小單位是字節)

Tcp recv返回值
正常狀況類就是發送的字節數據
斷開鏈接 收到空<--->收到空字節 表示段開鏈接

Tcp客戶端-----------------
import socket


def main():
# 1建立套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2連接服務器 地址(IP 端口)
tcp_socket.connect(("192.168.18.26", 8080))

# 3發送/接受數據
send_data = "要發送的數據"(默認是字節類型的數據)
tcp_socket.send(send_data.encode("utf8"))
# 查看返回的數據 對方斷開鏈接返回的就是b''
recv_data = tcp_socket.recv(1024)
print(recv_data)
# 關閉套接字
tcp_socket.close()
# print = input()
if __name__ == "__main__":
main()

Tcp服務器--------------
import socket


def main():
# 建立服務器套接字 大堂經理 IPV4 基於字節流
sever_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 綁定本地地址 供客戶端進行連接
sever_socket.bind(("", 6765))
# listen 監聽 主動變成被動 有客戶端連接才啓動
sever_socket.listen(128) # 128表示等待被服務的客戶端的最大數量
while True:
# accept 等待接受客戶端 轉到業務員
print("我在等待客戶端連接......")
# accept 的返回值是一個元組 裏面包含跟客戶端關聯的套接字對象(業務員) 和 客戶端的信息
client_socket, client_address = sever_socket.accept()
print("本次連接的客戶端是: %s ----- %s" % (str(client_address)))
# 給客戶端發送數據 Ack
client_socket.send("Welcome!!".encode("utf8"))
while True:
# 接受客戶端的數據
rece_data = client_socket.recv(4096)
# 若是客戶端發送的數據不爲空
if rece_data:
# 打印接受道德數據
print("客戶端發來的是:%s" % rece_data.decode("utf8"))
client_socket.send("請求已解決完成!!".encode("utf8"))
else:
# 若是客戶端斷開鏈接,返回的就是空,那麼就執行下面的代碼
print("本次服務的客戶端已經斷開連接!!!")
# 關閉服務客戶端的套接字 業務員
client_socket.close()
break # 客戶端斷開鏈接,結束服務,跳出循環接收下一個服務器套接字轉過來的客戶端

# 關閉服務器的套接字 大堂經理 這個不能關閉!!服務器要24小時待機等待客戶端的隨時連接
# sever_socket.close()


if __name__ == "__main__":
main()

基於字節流
最小單位是字節,一次不須要接收完,下一此接收能夠繼續接收,一次接收的數據也有多是對方屢次發送的


------------------------------------------------------------------------
三次握手 創建鏈接的時候

C 我想與你創建鏈接SYN_SENT S
S 收到請求後應答ACK 請求創建鏈接SYN C
S 成功創建鏈接ACK S


SYN同步請求,創建鏈接
ACK應答,收到請求後應該回復ACK

listen (128)
Linux中表示已就緒隊列長度即全鏈接長度
其它系統中表示全鏈接和半鏈接的總和
connect意義
發起並完成和服務器的三次握手
accept意義
從就緒隊列(全鏈接隊列)中取出一個全鏈接
-------------------------------------------------------------------------
四次揮手 斷開連的時候

主 斷開鏈接請求FINM 被
被 應答 主
被 斷開鏈接請求FINN 主
主 應答 被


再次運行 address in used的問題 Tcp之分手的代價......
爲了完全斷開鏈接 主動斷開鏈接的一方必須有一個責任 保持套接字鏈接的資源(特別是端口)30s到2m不等的時間不釋放 (通常是在服務器端使用,由於客戶端通常不綁定端口)
完全解決 地址重用-->建立服務器套接字對象以後--> 服務器套接字對象.setsockopt(socket.SOL_SOCK, socket.SO_REUSEADDR, 1)
------------------------------------------------------------------------


Http 超文本傳輸協議 用於web瀏覽器和web服務器之間傳輸網頁資源的一套協議格式
B S 鏈接協議 底層是Tcp 端口是80
基於TCP/IP協議實現的應用層協議
一次請求(request) 一次相應(response)
瀏覽器主動發起請求 web服務器被動響應
多個資源就是屢次請求屢次響應

Http瀏覽器請求的基本流程
1 輸入網址(http協議(端口) 域名 資源路徑)
2 域名發給DNS服務器解析域名獲得ip
3 創建和web服務器的鏈接
4 發送資源請求
5 web服務器根據請求讀取相應數據 按照必定格式發送給瀏覽器
6 瀏覽器接收數據而且解析顯示

url一般指的就是網址

TCP/IP協議有四層 OSI有七層(瞭解)

計算機網絡 --- 物流網絡
應用層Http 用戶寄快遞
傳輸層Tcp Udp 快遞公司
網絡層IP目標ip 中轉站(根據收件人地址)
網絡接口層 運輸方式(飛機.鐵路,汽車)


B >>我想要XX數據>> S
B <<請求結果和XX數據<< S

記憶模式 文本記憶4-5年 交流記憶20年

F12調出的界面
elements 查看網頁結構
console 調試網頁的js代碼
source 跟服務器請求過那些資源
network 瀏覽器和服務器之間的通訊過程

 

--------------------------------------------------------------------------------
Http請求報文格式說明

請求行 Request line
Get / Http/1.1-->請求方法/請求路徑/協議版本

請求方法
Get 主要用於瀏覽器向服務器請求數據
Post 主要用於瀏覽器向服務器推送數(提交)據
Head 測試服務器是否正常工做

/請求路徑
"/"表示web服務器主頁(首頁, 根目錄)

協議版本
Http/1.1

請求頭(鍵值對方式 頭: 域名\r\n) 頭, 域名都是字符串
Host:www.baidu.com
主機:服務器主機的域名/IP(:非默認端口)

Connection: Keep-alive
鏈接方式: 保持存活 --長鏈接-保持鏈接一直存活
close短連接,請求一次就關閉套接字

User-Agent:
用戶代理 標識用戶瀏覽器的身份
做用
1.服務器識別瀏覽,讓網頁適配瀏覽器
2.服務器反爬

Accept:
服務器能夠接受的數據/文件 的類型

Accept-Encoding:
服務器能夠接受的壓縮格式,
優勢:加快傳輸的效率
缺點:加劇CPU負荷(以性能高換時間短)

Accept-Language:
服務器接受的語言

請求體[瀏覽器須要上傳給服務器的數據] post請求方法時使用
請求體 是在兩個"\r\n"以後存在

Http請求報文格式都是以 \r\n 結尾

請求報文的格式
Get方式
請求行[Get 資源路徑 協議版本\r\n]
請求頭[頭名稱:值\r\n]
空行[\r\n]

Post方式
請求行[Get 資源路徑 協議版本\r\n]
請求頭[頭名稱:值\r\n]
空行[\r\n \r\n]
請求體


--------------------------------------------------------------------------------
Http響應報文格式 response

響應行-(狀態行)
Http/1.1 200 OK(協議版本 狀態碼 狀態說明)
2xx 2開頭的都是表示成功
3xx 3開頭的表示重定向(將瀏覽器訪問的地址重定向到指定的位置)
4xx 4開頭的表示客戶端請求錯誤
5xx 5開頭的都表示服務器端錯誤

響應頭
Connection: Keep-Alive
鏈接方式: 長鏈接-保持存活
Content-Encoding:gzip
內容壓縮的方式 瀏覽器根據壓縮方式進行解壓

Server:服務器程序的名字
web服務器程序的名字 最經常使用的是nginx 性能高/易擴展

Date: 時間
格林威治時間(0時區的時間)

Content-Type:內容的類型/編碼字符集
瀏覽器根據該字段對數據進行解析

Content-Language:語言
服務器發送過來的內容的語言

Content-Length: 字節長度
內容的長度:以字節爲單位

空行(\r\n)

響應體
回覆給瀏覽器的內容

響應報文格式
response_line 響應行="http/1.1 200 ok\r\n"
response_head響應頭="服務器版本等\r\n"
response_body響應體="服務器發送給瀏覽器的內容"
空行[\r\n]
要發送的數據 = response_line + response_head + "\r\n" + response_body

 

Http1.1默認長鏈接 默認存活connection:keep-alive
一個鏈接屢次使用
節約時間,用戶量過大容易形成服務器過載致使服務器不可用(以性能換時間)
現行web服務器主要使用長鏈接

Http1.0默認短連接 默認關閉connection:close
管理簡單
用戶量比較大時形成服務器響應過慢 大量建立和銷燬鏈接
--------------------------------------------------------------------------------
web服務器 nginx產品

本身寫web服務器的意義:理解web服務器的工做流程

--------------------------------------------------------------------------------
CSS 用來設置網頁樣式

經過命令行指定端口的意義
不用修改源代碼 下降和源代碼的耦合度 更加安全

操做系統將命令行參數放到sys模塊的argv變量中(argv是一個列表,每一個元素都是字符串類型)
----------------------------------------------------------------------------------
多任務
目的: 同時執行多個任務 提升程序的運行效率
時間片: cpu分配給程序運行的一小段時間
兩種形式 :併發-->在同一時間段 輪流切換 運行的多個任務(時間片輪轉)
並行-->在同一時間點 不一樣cpu 運行的多個任務


線程:程序執行時的流程/分支(操做系統進行調用執行的基本單位)
默認只有一個流程/分支 即 主線程 新建的線程稱爲 子線程
-------------------------------------------------------------------------------------------------------------------
建立線程

建立線程的步驟:

須要導入threading模塊 導入thread類
子線程實例對象 = threading.Thread(target=子線程要執行的函數名, args =("位置參數",),kwargs={"參數名":"實參值"})
子線程實例對象.start()
對象名.join() 等待子線程執行完成


target--入口
args--給線程函數傳遞位置參數,args 是一個元組
kwargs--給線程函數傳遞關鍵字參數,kwargs 是一個字典

子線程.join()方法等待子線程運行完成

-------------------------------------------------------------------------------------------------------------------
多線程之間的運行是無序的

獲取當前程序中存在的線程
threading.enumerate()

子線程會在執行完代碼以後退出
但主線程會一直存在
因此主線程會等待全部最線程運行結束後再退出

daemon線程(守護線程) 若是當前程序中 只剩下daemon線程 那麼整個程序就會退出
設置daemon線程的方法
子線程名.setDaemon(True)
-------------------------------------------------------
自定義線程類的步驟

1建立一個類,讓這個類繼承(threading.Thread)類
2實現run(self)方法
3建立子線程的實例對象()
4子線程實例對象.start()
-------------------------------------------------------
start()只會調用run()方法
其它方法須要在run方法裏面進行調用

-------------------------------------------------------
同一個進程的多個線程共享全局變量
資源競爭(數據競爭) 因爲多線程共享數據, 多線程不加限制一塊兒修改共享數據致使數據混亂
-------------------------------------------------------
使用互斥鎖加限制進行解決 可以保證在任意時刻只有一個任務可以成功佔有鎖
建立 鎖對象 =threading.Lock()
加鎖 鎖對象.acquire()
解鎖 鎖對象.release()

優勢: 保證多線程可以正確修改全局變量的值
缺點: 容易形成死鎖,致使程序阻塞(一個子線程acquire()了互斥鎖以後沒有進行釋放)
-------------------------------------------------------
with語法(寫入文件時的用法)
with open("文件路徑+文件名", "模式") as 文件對象:
文件對象.write(數據)

自動申請和釋放資源

with語法(互斥鎖時使用方法)
with lock:
全局變量名的操做
-------------------------------------------------------
udp聊天器思路
1主線程input sendto
子線程 recvfrom

------------------------------------------------------
進程 進程 進程 進程 進程
------------------------------------------------------
進程 (操做系統進行 資源分配 的基本單位)
在一個正在運行的程序中默認有一個進程--(主進程)
新建的進程--子進程
在一個進程中默認存在一個線程(主線程)
-------------------------------------------------------
單任務(單進程 單線程 的程序)
多進程多線程均可以完成多任務
-------------------------------------------------------
進程的狀態
新建
ready 就緒態:運行的條件都已經慢去,等待cpu執行(完事俱備,只欠時間片)
running 執行態:cpu正在執行其功能 (當時間片用完就會返回到就緒態),(調用阻塞的函數就會進入等待態)
blocked 等待態:等待知足其條件(知足條件時會返回到就緒態)
死亡
-------------------------------------------------------
建立進程
實例對象名 = multiprocessing.Process(target=要調用的方法名(入口), args=("位置參數",), kwargs={"鍵":"值"})
實例對姓名.start()
-------------------------------------------------------
查看進程id的兩種方式
os.getpid()
multiprocessing.current_process().pid
-------------------------------------------------------
終端查看方法
ps aux | grep "*.py"
-------------------------------------------------------
獲取當前進程的父進程的id
os.getppid()
主進程就是子進程的父進程

主進程的父進程就是IDE
-------------------------------------------------------
子進程實例對象.join() 括號了的參數表示等待的時間,不填是默認永久,單位是秒
子進程結束後回收子進程佔用的資源
-------------------------------------------------------
子進程實例對象.terminate()無論任務是否完成直接結束子進程

子進程實例對象.name name參數 得到子進程的名字
-------------------------------------------------------
多個進程執行的順序是無序的

多個 進程 之間不共享全局變量 資源分配的單位 一個進程一個獨立的空間

主進程會在全部子進程運行完成後結束運行
-------------------------------------------------------
Queue 其實就是一個用於 (父子進程) 進程間相互通訊 的先進先出的隊列
建立Queue隊列
隊列實例對象名 = multiprocessing.Queue(隊列的長度)
放數據 隊列實例對象名.put(數據)
取數據 隊列實例對象名.get()
判滿 隊列實例對象名.full()
判空 隊列實例對象名.empty()

*** python 不能在子進程 中使用input()函數

get / put 參數說明
block參數 表示若是沒有知足條件 是否阻塞等待
timeout參數 表示若是等待 等待的時常

 

進程池
工做模式

工程隊模式
提早準備一批進程爲用戶提供服務 可以更快地響應用戶的需求, 循環使用已經空閒的的進程爲後續的用戶提供服務(節約進程的 建立和銷燬 的開銷)

(包工頭)控制進程:專門進行任務調度的進程 當前的主進程就是控制進程
(工人)工做進程:專門處理用戶的各類需求的進程

使用步驟
1建立進程池--> 進程池實例對象名 = multiprocessing.Pool(工做進程的數量)
2往進程池中添加數據-->同步 進程池實例對象名.apply(func = 指定要調用的方法(入口),args=(位置參數),), kwds{鍵:值}||添加任務後等待執行
2往進程池中添加數據-->異步 進程池實例對象名.apply_async(func = 指定要調用的方法,args=(位置參數,), kwds{鍵:值})||添加任務後直接向下執行
3關閉進程池-->進程池實例對象名.close()
4等待全部任務執行完成-->進程池實例對象名.join()


進程
分配資源 的基本單位 資源開銷大 性能很高 穩定性好 cpu密集型(科學計算)

線程
調度執行 的基本單位 資源開銷小 性能次之 穩定性較差 io密集型 (網絡程序/文件讀寫,輸入/輸出)

 

------------------------------------------------------------------------------------------
迭代 藉助記錄用戶訪問位置的對象(迭代器) 把容器中的數據所有訪問到的過程
迭代器 記錄用戶在迭代過程當中的位置信息的對象
可迭代對象 可以能夠被迭代的對象(容器,)

迭代器開發的意義:
1用戶只須要操做迭代器,不須要關心可迭代對象的操做方式 操做簡單
每一種可迭代對象都提供響應的迭代器
2解耦和 面向數據操做>>>-->>>面向迭代器 數據有變化時只須要變迭代器 用戶不受影響
下降了用戶和數據的耦合度

可迭代的對象 : 提供數據(提供迭代器)
迭代器: 訪問數據, 把數據提供給用戶 ,自動記錄位置信息

判斷對象是不是可迭代對象
isinstance(對象名,collections.Iterable)
判斷對象是不是迭代器對象
isinstance(對象名,collections.Iterator)

自定義可迭代對象
class Iterable:
在類裏面定義__iter__方法 ,而後使用本類建立的實例對象就是可迭代對象
__iter__ 方法 提供用於獲取數據的迭代器
def __inter__(self):


迭代器類型
class Iterator:
在類中實現了__iter__() 和 __next__() 方法 ,這個類建立的實例對象就是迭代器對象
def __init__(self, 數據): # 建立實例對象的傳過來的參數
self.data = data
self.index = 0 #索引以0爲始


def __iter__() 提供迭代器
return self # 本身便是迭代器

def __next__() 提供下一個元素的值 若是迭代完成拋出中止迭代異常 (會在for循環中被for捕獲)
if self.index >= len(self.data): #若是index超出數據的長度表示迭代完成,就拋出中止迭代的異常
raise StopIteration
else:
ret = self.data[self.index]#數據是index對應的數據
self.index += 1 #讓index加1獲取下一個
return ret #返回數據

 


生成器
簡介的迭代器
按照規律生成數據 存儲規律 的特殊的迭代器
訪問的是臨時生成的有某種規律的數據

生成器表達式
數據 = (x for x in 可迭代的容器)
佔用資源小

列表推導式
數據 = [x for x in 可迭代的容器]

生成器是可迭代類型

生成器函數
yield關鍵字
將普通函數變爲生成器函數 ,
暫停代碼執行,將變量的值返回給調用生成器對象的地方
再次喚醒生成器的時候,是從剛剛暫停的位置繼續往下執行

普通方式調用函數函數並不會執行,會建立生成器對象

python3中生成器可使用return python2 不支持
執行return 代碼結束,再也不向下執行, 執行yield再次喚醒生成器的時候從剛剛暫停的位置繼續往下執行


next(), send() 都是從生成器代碼中取出下一個元素的值

next()方法不能傳參
send()在執行生成器代碼 的時候傳參, 可是在剛剛啓動的時候只能傳None

---------------------------------------------------------------------------------------------------
協程
不開闢新線程的狀況下完成多任務 按照必定的交替順序執行
協程是 用戶的代碼進行調度的
進程和線程 是操做系統內核進行調度的

yeild greenlet


gevent
基於greenlet實現
在gevent 中默認不會自動切換多任務 須要使用gevent中的monkey.patch_all()解決

gevent的使用步驟
import gevent
from gevent import mokey-->放在最上邊(gevent官方規定)
monkey.patch_all() # 自定切換

建立協程(自動執行的代碼)
協程對象名 = gevent.spawn(要執行的方法名,協程的參數)
協程對象名.join() # 一個一個join()
gevent.joinall() # 等待全部協程執行結束在結束


進程 線程 協程
資源消耗大 消耗通常效率高 消耗小效率高程序性能不過高
IO密集型 適合IO密集型
併發度不過高不超過6萬 併發度高

 

 

 

 

 

UNIX 一切皆文件!

相關文章
相關標籤/搜索