# 1. socketservers
1) server = socketserver.TCPserver((HOST,PORT),MyTCPHandler) # 實例化一個 server
? ? ?socketserver.TheadingTCPserver() # 多線程
? ? ?socketserver.ForkingTCPserver() ? # 多進程
2) server.handle_request() # 僅處理一個請求
server.serve_forever()? # 處理多個請求
3) server_close() 關系 socketserver
# 2. paramiko 模塊
import paramiko
ssh = paramiko.SSHClient()
# 3. 進程枯怖、線程
方法
start() # 線程準備就緒兜粘,等待CPU調度
setName() # 為線程設置名稱
getName() # 獲取線程名稱
setDaemon(True) # 設置為守護線程
join() # 逐個執(zhí)行每個線程赠橙,執(zhí)行完畢后繼續(xù)往下執(zhí)行
run() # 線程被cpu調度后自動執(zhí)行線程對象的run方法,如果想自定義線程類惕鼓,直接重寫run方法就行了
線程進程的區(qū)別:
1.同一個進程中的線程共享同一內存空間,但是進程之間是獨立的唐础。
2.同一個進程中的所有線程的數(shù)據是共享的(進程通訊)箱歧,進程之間的數(shù)據是獨立的。
3.對主線程的修改可能會影響其他線程的行為一膨,但是父進程的修改(除了刪除以外)不會影響其他子進程呀邢。
4.線程是一個上下文的執(zhí)行指令,而進程則是與運算相關的一簇資源豹绪。
5.同一個進程的線程之間可以直接通信价淌,但是進程之間的交流需要借助中間代理來實現(xiàn)。
6.創(chuàng)建新的線程很容易瞒津,但是創(chuàng)建新的進程需要對父進程做一次復制蝉衣。
7.一個線程可以操作同一進程的其他線程,但是進程只能操作其子進程巷蚪。
8.線程啟動速度快买乃,進程啟動速度慢(但是兩者運行速度沒有可比性)。
**python的線程中沒有優(yōu)先級钓辆、線程組剪验,也不能被停止、暫停前联、恢復功戚、中斷,線程只能隨著線程中的代碼執(zhí)行完畢而被銷毀似嗤。**
守護線程
t.setDaemon(True) # 把子線程變成守護線程
t.start()? ? ? ? ? # 開始線程
擴展閱讀:
[搞定python多線程和多進程 ](https://www.cnblogs.com/whatisfantasy/p/6440585.html)
[由淺入深:Python多線程編程詳解](http://www.ywlib.com/archives/19.html)
# 4.GIL
* GIL的全稱是Global Interpreter Lock(全局解釋器鎖)
* GIL的釋放邏輯是當前線程遇見IO操作或者ticks計數(shù)達到100
* sys.setcheckinterva 用于調整 ticks(僅python2)
擴展閱讀:
[為什么在Python里推薦使用多進程而不是多線程](http://bbs.51cto.com/thread-1349105-1.html)
# 5.互斥鎖
lock = threading.lock() # 創(chuàng)建鎖
lock.acquire() # 請求鎖
lock.release() # 釋放鎖
# 6.遞歸鎖
lock = threading.Rlock()
# 7.信號量
semaphore = threading.BoundedSemaphore(5) #最多同時允許5個線程同時運行
# 8.Events 事件
event = threading.Event()
event.clear # 將flag設置為“False”
event.set # 將flag設置為“True”
event.is_set # 判斷是否設置了flag,用來初始化狀態(tài)
event.wait # 會一直監(jiān)聽flag啸臀,如果沒有檢測到flag就一直處于阻塞狀態(tài)
# 9.隊列
``` python
import queue
q = queue.Queue(maxsize = 3) # 實例化一個隊列(先入先出),最多放3個元素
q = queue.LifoQueue() # 實例化一個隊列(后入先出)
q = queue.PriorityQueue() # 實例化一個隊列(可設置優(yōu)先級)
q.put() # 放入隊列
q.qsize() # 隊列大小
q.get() # 從隊列取數(shù)據
q.get_nowait() # 如果取不到會拋出一個異常
```
# 10.定時器
定時 n 秒后執(zhí)行操作
``` python
from threading import Timer
def hello():
print("hello, world")
t = Timer(1, hello)
t.start()? # after 1 seconds, "hello, world" will be printed
```
# 11.多線程的使用場景:
* IO操作不占用CPU
* 計算占用CPU
* python 多線程不適合 CPU 密集操作型的任務,適合IO操作密集型的任務
# 12.多進程語法:
from multiprocessing import Process
def f():
print("123")
p = Process(target=f, args=('bob',))
# 13.進程之間數(shù)據交換
進程之間數(shù)據是不共享的,所以不會出現(xiàn)多線程GIL帶來的問題乘粒。多進程之間的通信通過Queue()或Pipe()來實現(xiàn)
Queue() # 使用方法跟threading里的queue差不多
pips() # Pipe的本質是進程之間的數(shù)據傳遞豌注,而不是數(shù)據共享,這和socket有點像
manager()? # 通過Manager可實現(xiàn)進程間數(shù)據的共享灯萍。
Manager()返回的manager對象會通過一個服務進程轧铁,來使其他進程通過代理的方式操作python對象。
manager對象支持 list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition,
Event, Barrier, Queue, Value ,Array.
* 示例:
``` python
from multiprocessing import Process, Manager
with Manager() as manager:
d = manager.dict()
l = manager.list(range(5))
```
# 14.進程鎖
lock = lock()
進程鎖存在的意義:共享設備旦棉,例如標準輸出設備等
# 15.進程池
apply() # 同步執(zhí)行(串行)
apply_async() # 異步執(zhí)行(并行)
terminate() # 立刻關閉進程池
join() # 主進程等待所有子進程執(zhí)行完畢齿风。必須在close或terminate()之后。
close() # 等待所有進程結束后绑洛,才關閉進程池救斑。
windows 啟動多進程:
必須加入: if __name__ == '__main__':
# callback? [回調函數(shù)]執(zhí)行后再調用(通過主進程調用)
注:
poll.close()
poll.join()? ? # 必須先close 再 join
# 16.協(xié)程
安裝 Creenlet? ? # Creenlet 手動切換? gevent 啟動切換(對 gevent 的封裝)
import Greenlet
gr1 = greenlet(test1) # 啟動一個協(xié)程
gr2 = greenlet(test2)
gr1.switch()
# 17.gevnet 爬網頁
import urllib
# urllib 默認 不知道 gevent 需要monkey.path_all()
monkey.path_all() # 把但錢程序的所有的IO操作做標記
# 18.事件驅動
# 19.多路IO復用/異步IO復用
select.select(inputs,outputs,)