多線程

線程:是操做系統的最小調度單位,是一串指令的集合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),
])    

  

參考博主:金角大王

相關文章
相關標籤/搜索