1. socketservers
1) server = socketserver.TCPserver((HOST,PORT),MyTCPHandler) # 實(shí)例化一個(gè) server
socketserver.TheadingTCPserver() # 多線程
socketserver.ForkingTCPserver() # 多進(jìn)程
2) server.handle_request() # 僅處理一個(gè)請(qǐng)求
server.serve_forever() # 處理多個(gè)請(qǐng)求
3) server_close() 關(guān)系 socketserver
2. paramiko 模塊
import paramiko
ssh = paramiko.SSHClient()
3. 進(jìn)程、線程
方法
start() # 線程準(zhǔn)備就緒御板,等待CPU調(diào)度
setName() # 為線程設(shè)置名稱
getName() # 獲取線程名稱
setDaemon(True) # 設(shè)置為守護(hù)線程
join() # 逐個(gè)執(zhí)行每個(gè)線程锥忿,執(zhí)行完畢后繼續(xù)往下執(zhí)行
run() # 線程被cpu調(diào)度后自動(dòng)執(zhí)行線程對(duì)象的run方法,如果想自定義線程類怠肋,直接重寫run方法就行了
線程進(jìn)程的區(qū)別:
1.同一個(gè)進(jìn)程中的線程共享同一內(nèi)存空間敬鬓,但是進(jìn)程之間是獨(dú)立的。
2.同一個(gè)進(jìn)程中的所有線程的數(shù)據(jù)是共享的(進(jìn)程通訊)笙各,進(jìn)程之間的數(shù)據(jù)是獨(dú)立的钉答。
3.對(duì)主線程的修改可能會(huì)影響其他線程的行為,但是父進(jìn)程的修改(除了刪除以外)不會(huì)影響其他子進(jìn)程杈抢。
4.線程是一個(gè)上下文的執(zhí)行指令数尿,而進(jìn)程則是與運(yùn)算相關(guān)的一簇資源。
5.同一個(gè)進(jìn)程的線程之間可以直接通信惶楼,但是進(jìn)程之間的交流需要借助中間代理來實(shí)現(xiàn)右蹦。
6.創(chuàng)建新的線程很容易,但是創(chuàng)建新的進(jìn)程需要對(duì)父進(jìn)程做一次復(fù)制歼捐。
7.一個(gè)線程可以操作同一進(jìn)程的其他線程何陆,但是進(jìn)程只能操作其子進(jìn)程。
8.線程啟動(dòng)速度快豹储,進(jìn)程啟動(dòng)速度慢(但是兩者運(yùn)行速度沒有可比性)贷盲。
python的線程中沒有優(yōu)先級(jí)、線程組剥扣,也不能被停止巩剖、暫停慨灭、恢復(fù)、中斷球及,線程只能隨著線程中的代碼執(zhí)行完畢而被銷毀氧骤。
守護(hù)線程
t.setDaemon(True) # 把子線程變成守護(hù)線程
t.start() # 開始線程
擴(kuò)展閱讀:
搞定python多線程和多進(jìn)程
由淺入深:Python多線程編程詳解
4.GIL
- GIL的全稱是Global Interpreter Lock(全局解釋器鎖)
- GIL的釋放邏輯是當(dāng)前線程遇見IO操作或者ticks計(jì)數(shù)達(dá)到100
- sys.setcheckinterva 用于調(diào)整 ticks(僅python2)
擴(kuò)展閱讀:
為什么在Python里推薦使用多進(jìn)程而不是多線程
5.互斥鎖
lock = threading.lock() # 創(chuàng)建鎖
lock.acquire() # 請(qǐng)求鎖
lock.release() # 釋放鎖
6.遞歸鎖
lock = threading.Rlock()
7.信號(hào)量
semaphore = threading.BoundedSemaphore(5) #最多同時(shí)允許5個(gè)線程同時(shí)運(yùn)行
8.Events 事件
event = threading.Event()
event.clear # 將flag設(shè)置為“False”
event.set # 將flag設(shè)置為“True”
event.is_set # 判斷是否設(shè)置了flag,用來初始化狀態(tài)
event.wait # 會(huì)一直監(jiān)聽flag,如果沒有檢測(cè)到flag就一直處于阻塞狀態(tài)
9.隊(duì)列
import queue
q = queue.Queue(maxsize = 3) # 實(shí)例化一個(gè)隊(duì)列(先入先出),最多放3個(gè)元素
q = queue.LifoQueue() # 實(shí)例化一個(gè)隊(duì)列(后入先出)
q = queue.PriorityQueue() # 實(shí)例化一個(gè)隊(duì)列(可設(shè)置優(yōu)先級(jí))
q.put() # 放入隊(duì)列
q.qsize() # 隊(duì)列大小
q.get() # 從隊(duì)列取數(shù)據(jù)
q.get_nowait() # 如果取不到會(huì)拋出一個(gè)異常
10.定時(shí)器
定時(shí) n 秒后執(zhí)行操作
from threading import Timer
def hello():
print("hello, world")
t = Timer(1, hello)
t.start() # after 1 seconds, "hello, world" will be printed
11.多線程的使用場(chǎng)景:
- IO操作不占用CPU
- 計(jì)算占用CPU
- python 多線程不適合 CPU 密集操作型的任務(wù)吃引,適合IO操作密集型的任務(wù)
12.多進(jìn)程語(yǔ)法:
from multiprocessing import Process
def f():
print("123")
p = Process(target=f, args=('bob',))
13.進(jìn)程之間數(shù)據(jù)交換
進(jìn)程之間數(shù)據(jù)是不共享的筹陵,所以不會(huì)出現(xiàn)多線程GIL帶來的問題。多進(jìn)程之間的通信通過Queue()或Pipe()來實(shí)現(xiàn)
Queue() # 使用方法跟threading里的queue差不多
pips() # Pipe的本質(zhì)是進(jìn)程之間的數(shù)據(jù)傳遞镊尺,而不是數(shù)據(jù)共享朦佩,這和socket有點(diǎn)像
manager() # 通過Manager可實(shí)現(xiàn)進(jìn)程間數(shù)據(jù)的共享。
Manager()返回的manager對(duì)象會(huì)通過一個(gè)服務(wù)進(jìn)程庐氮,來使其他進(jìn)程通過代理的方式操作python對(duì)象语稠。
manager對(duì)象支持 list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition,
Event, Barrier, Queue, Value ,Array.
- 示例:
from multiprocessing import Process, Manager
with Manager() as manager:
d = manager.dict()
l = manager.list(range(5))
14.進(jìn)程鎖
lock = lock()
進(jìn)程鎖存在的意義:共享設(shè)備,例如標(biāo)準(zhǔn)輸出設(shè)備等
15.進(jìn)程池
apply() # 同步執(zhí)行(串行)
apply_async() # 異步執(zhí)行(并行)
terminate() # 立刻關(guān)閉進(jìn)程池
join() # 主進(jìn)程等待所有子進(jìn)程執(zhí)行完畢弄砍。必須在close或terminate()之后仙畦。
close() # 等待所有進(jìn)程結(jié)束后,才關(guān)閉進(jìn)程池音婶。
windows 啟動(dòng)多進(jìn)程:
必須加入: if __name__ == '__main__':
# callback [回調(diào)函數(shù)]執(zhí)行后再調(diào)用(通過主進(jìn)程調(diào)用)
注:
poll.close()
poll.join() # 必須先close 再 join
16.協(xié)程
安裝 Creenlet # Creenlet 手動(dòng)切換 gevent 啟動(dòng)切換(對(duì) gevent 的封裝)
import Greenlet
gr1 = greenlet(test1) # 啟動(dòng)一個(gè)協(xié)程
gr2 = greenlet(test2)
gr1.switch()
17.gevnet 爬網(wǎng)頁(yè)
import urllib
# urllib 默認(rèn) 不知道 gevent 需要monkey.path_all()
monkey.path_all() # 把但錢程序的所有的IO操作做標(biāo)記
18.事件驅(qū)動(dòng)
19.多路IO復(fù)用/異步IO復(fù)用
select.select(inputs,outputs,)