一杨耙、42_(1)greenlet
"""可以用greenlet替換(代)yield"""
from greenletimport greenlet
import time
"""
協(xié)程其實(shí)是一個(gè)假的多任務(wù),真的多任務(wù)叫并行,
假的多任務(wù)叫并發(fā)。
導(dǎo)入的greenlet其實(shí)是一個(gè)類,可以實(shí)例化并調(diào)用飘痛。
實(shí)際開發(fā)中不使用; 用gevent
"""
def test1():
while True:
print ("---A--")
"""執(zhí)行text2()函數(shù)"""
? ? ? ? gr2.switch()
time.sleep(0.5)
def test2():
while True:
print ("---B--")
gr1.switch()
time.sleep(0.5)
gr1 = greenlet(test1)
gr2 = greenlet(test2)
"""執(zhí)行函數(shù)text1()"""
gr1.switch()
二珊膜、42_使用gevent實(shí)現(xiàn)多任務(wù)
import gevent
"""推薦使用gevent實(shí)現(xiàn)多任務(wù)"""
import time
"""
gevent遇到【sleep:暫停(延時(shí))】就切換到下一個(gè)命令執(zhí)行
;沒有就不切換
"""
from geventimport monkey
"""給程序打補(bǔ)丁"""
# 有耗時(shí)操作時(shí)需要
monkey.patch_all()
"""
將這個(gè)程序中用到的sleep:耗時(shí)操作的
代碼gevent.sleep,換為time.sleep"""
def f1(n):
for iin range(n):
print(gevent.getcurrent(), i)
time.sleep(0.5)
# gevent.sleep(0.5)
? ? ? ? """循環(huán)遍歷數(shù)字5,遍歷一次延時(shí)0.5"""
def f2(n):
for iin range(n):
print(gevent.getcurrent(), i)
time.sleep(0.5)
# gevent.sleep(0.5)
def f3(n):
for iin range(n):
print(gevent.getcurrent(), i)
time.sleep(0.5)
# gevent.sleep(0.5)
"""
1、程序啟動(dòng)稱為:進(jìn)程(資源分配的單位);
2宣脉、執(zhí)行代碼的是:線程
3车柠、單線程里執(zhí)行多任務(wù):協(xié)程
進(jìn)程關(guān)閉、線程、協(xié)程隨之掛掉
"""
print("---1---")
g1 = gevent.spawn(f1, 5)
"""參數(shù)f指定協(xié)程在哪執(zhí)行, 需要傳參就在后邊直接寫"""
print("---2---")
g2 = gevent.spawn(f2, 5)
print("---3---")
g3 = gevent.spawn(f3, 5)
print("---4---")
g1.join()
g2.join()
g3.join()
"""
recvfrom()? #阻塞
# socket.connect()
# socket.accepet()
gevent.connect()
gevent.accepet()
"""
三竹祷、43_(1)圖片下載器
"""gevent案例: 并發(fā)下載器"""
import urllib.request#爬蟲經(jīng)常用
# urllib.request.urlopen()
"""在urlopen()寫上網(wǎng)址,可以和網(wǎng)址溝通"""
req = urllib.request.urlopen("http://www.baidu.con")
print(req.read())# read(): 讀
四谈跛、43_(2)gevent_img_xzq
import urllib.request
"""gevent圖片下載器"""
import gevent
from geventimport monkey
"""
爬多張圖片可以封裝成函數(shù),
一個(gè)函數(shù)應(yīng)該完成一個(gè)功能
"""
monkey.patch_all()
"""
將這個(gè)程序中用到的sleep:耗時(shí)操作的
代碼gevent.sleep,換為time.sleep"""
def Pa1Ztu(img_name, img_url):
"""# img_name==(圖片名. 格式)"""
? ? req = urllib.request.urlopen(img_url)
img_content = req.read()#讀圖
? ? with open(img_name, "wb")as f:
f.write(img_content)
"""? ? ? ? !把圖片保存到文件!
open:打開文件】, 第一個(gè)參數(shù)為圖片名和
保存形式【wb:二進(jìn)制的寫入】拿到的圖
片是二進(jìn)制的,【write:寫入"""
"""def miam():爬多張圖的函數(shù)功能"""
def main():
gevent.joinall([
gevent.spawn(Pa1Ztu, "1.png", "http://p3.fx.kgimg.com/v2/fxuserlogo/00ea60c75e06bf74fce5507878e53a59.jpg_200x200.jpg"),
? ? ? ? # gevent.spawn(PaYiZTu, "2.jpg", "")
? ? ])
if __name__ =="__main__":
main()
五、45_http協(xié)議1
一塑陵、瀏覽器向服務(wù)器發(fā)送的(請(qǐng)求)格式
1感憾、GET: 瀏覽器向服務(wù)器索取數(shù)據(jù)(資源)
2、GET后面的是請(qǐng)求的網(wǎng)址名令花、協(xié)議版本
3吹菱、Host: 服務(wù)器的Ip地址、端口
4彭则、keep-alive: 長鏈接
5鳍刷、Accept: 服務(wù)器可以接收的數(shù)據(jù)格式
6、User-Agent: 瀏覽器的版本
7俯抖、Accept-Encoding: 能夠接收的壓縮格式
8输瓜、Accept-Language: 能接收的語言
二、服務(wù)器-->瀏覽器回送的數(shù)據(jù)格式如下:
1芬萍、Cache-Control:private 緩存是共享或私有的, 目前私有
2尤揣、Content-Encoding: 編碼格式, 瀏覽器按此格式解壓
3、Content-Type: 傳輸?shù)氖且粋€(gè)html的頁面
4柬祠、Date: 服務(wù)器當(dāng)前的時(shí)間
5北戏、Server: 服務(wù)器, Bws是百度的服務(wù)器
6、Set-Cookie: 類似于xx服務(wù)器收集用戶的信息數(shù)據(jù)
三漫蛔、http(超文本傳輸)協(xié)議: 基于Tcp
六嗜愈、47_簡單web服務(wù)器實(shí)現(xiàn)
"""
http(超文本傳輸)協(xié)議: 基于Tcp
Tcp類似于2人通話可以接收到(穩(wěn)定);
Cdp類似于廣播, 有可能接收不到
"""
"""實(shí)現(xiàn)簡單的http服務(wù)器"""
import socket
def service_client(new_socket):
"""為客戶端返回?cái)?shù)據(jù)"""
? ? # 1、接收瀏覽器發(fā)送過來的請(qǐng)求, 即http請(qǐng)求
# -->例GET / HTTP/1.1 .....
? ? requst = new_socket.recv(1024)
print(requst)
# 2莽龟、返回http格式的數(shù)據(jù)給瀏覽器
# 2.1 準(zhǔn)備給瀏覽器發(fā)送的數(shù)據(jù) :Header
? ? response ="HTTP/1.1 200 OK\r\n"
? ? response +="\r\n"
? ? """【\r\n: 換行(兼容所有的瀏覽器)】"""
? ? # 2.2 準(zhǔn)備給瀏覽器發(fā)送的數(shù)據(jù) :Body
? ? response +="
hehehe
"
? ? new_socket.send(response.encode("utf-8"))
"""【send: 發(fā)送【encode: 編碼】"""
? ? # 關(guān)閉套接字
? ? new_socket.close()
def main():
"""用來整體控制"""
? ? # 1蠕嫁、創(chuàng)建套接字
? ? tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
"""選擇讓服務(wù)端先關(guān)閉"""
? ? # 2、綁定; 參數(shù)("任意服務(wù)端ip", 端口)
? ? tcp_server_socket.bind(("", 7890))
# 3毯盈、變?yōu)楸O(jiān)聽的套接字; 【listen:最大鏈接數(shù)】
? ? tcp_server_socket.listen(128)
while True:
# 4剃毒、等待新客戶端的連接; 變量[新客戶端的套接字, 客戶端的IP、端口]
? ? ? ? new_socket, client_addr = tcp_server_socket.accept()
# 5搂赋、為這個(gè)客戶端服務(wù)
? ? ? ? service_client(new_socket)
# 6赘阀、關(guān)閉監(jiān)聽套接字
? ? tcp_server_socket.close(new_socket)
if __name__ =='__main__':
main()