線程:是操做系統的最小調度單位,是一串指令的集合python
import threading def foo(n): print("in func foo ",n ) t_list = [] for i in range(20): t = threading.Thread(target=foo,args=("t-%s" %i ,)) #建立一個線程 t.start() #啓動一個線程 t_list.append(t) for i in range(20): t.join() #等待線程結束
threading.current_thread() threading.active_count() t.setDaemon(True) #把當前線程設置爲守護線程,隨主線程down,在t.start()以前設置
線程鎖多線程
import threading lock = threading.Lock() #建立一個鎖 lock.acquire() #申請一個鎖 ........ #運算操做 lock.release() #釋放一個鎖
遞歸鎖app
import threading lock = threading.RLock() #用法與線程鎖相似,防止不一樣線程鎖之間拿錯「鑰匙」
信號量異步
import threading semaphore = threading.BoundedSemaphore(5) # 最多容許5個線程同時運行
Event 事件socket
import threading event = threading.Event() #定義一個事件 event.set() #設置標誌位 event.clear() #清楚標誌位
隊列 async
import queue q = queue.Queue() q.get() q.put()
IO操做不佔用CPU 就算佔用CPUui
Python多線程不適合CPU密集操做性任務,適合IO密集操做性任務spa
進程操作系統
import multiprocessing multiprocessing.Process() #與線程相似
獲取進程ID:
import os
os.getppid() #獲取父進程ID
os.getpid() #獲取進程ID
#每個子進程都是由父進程啓動的
#進程queue 不是修改一份數據,實現數據的傳遞
進程鎖,進程池pool
pool.apply() #同步
pool.apply_async() #異步
pool使用中,先pool.close() 再 pool.join()
協程:微線程,用戶態的輕量級線程線程
from greenlet import greenlet #封裝好的協程 須要手動切換 .switch() def foo(): print (1) gr2.switch() print (2) gr2.switch() def f2(): print (3) gr1.switch() print (4) gr1.switch() gr1 = greenlet(foo) gr2 = greenlet(f2) gr1.switch()
自動切換Gvent
import gevent from gevent import socket, monkey monkey.patch_all() #全部io操做 def foo(): pass def bar(): pass gevent.joinall([ gevent.spawn(foo), gevent.spawn(bar), ])
參考博主:金角大王