併發 --- 5 線程的其餘方法 線程隊列 線程池 協程

一.線程的其餘方法

  1.   theading.current_thread()   當前線程對象python

  2.   .getName()    獲取線程名異步

  3.   .ident()   獲取線程idide

  4.    threading.enumerate()   當前正在運行的線程對象的一個列表函數

  5.    threading.active_count()   當前正在運行的線程數量spa

 

二.線程隊列

  1.先進先出隊列    queue.Queue()線程

 

  2.先進後出隊列    queue.LifoQueue()協程

  (和用法相同)對象

  3.優先級隊列    queue.priorityQueue()blog

  Put的數據是一個元組,元組的第一個參數是優先級數字,隊列

  數字越小優先級越高,越先被get到被取出來,第二個參數

  是put進去的值,若是說優先級相同,那麼值別忘了應該是

  相同的數據類型,字典不行

 

三.線程池

  1.from concurrent_futures import ThreadPoolExecutor,ProcessPoolExecutor

    引入模塊

  2.  p = ThreadPoolExecutor(4)

    默認的線程個數是cpu個數的5倍

  3.  p = ProcessPoolExecutor(4)

    默認的進程個數是cpu的個數

  4.  p.map(f1,可迭代對象)

    異步執行

  5.  res = p.submit(f1,11,12)  

    異步提交任務  參數但是多個

  6.  res.result()

    (和.get方法同樣,若是沒有結果會等待,阻塞程序)

  7.  shutdown()   

    (和close+join用法同樣,鎖定線程池,等待線程池中的

    任務所有執行完畢)

   8.線程池的回調函數

 

四.協程

  協程是一種用戶態的輕量級線程,即協程是由用戶程序本身控制調度的。

  1.生成器類型協程(實現了‘切換+保存狀態’,但沒有提高效率)

 

  2.greenlet模塊類型協程(實現了‘切換+保存狀態’,但沒有提高效率)

 

  3.gevent模塊類型的協程

  即實現了‘切換+保存狀態’,又提高效率

 

import gevent
from gevent import monkey;monkey.patch_all()
import time
import threading
def f1():
    print('第一次f1')
    # print(threading.current_thread().getName())
    # gevent.sleep(1)
    time.sleep(2)
    print('第二次f1')
def f2():
    # print(threading.current_thread().getName())
    print('第一次f2')
    # gevent.sleep(2)
    time.sleep(2)
    print('第二次f2')
g1 = gevent.spawn(f1) #異步提交了f1任務
g2 = gevent.spawn(f2) #異步提交了f2任務
# g1.join()
# g2.join()
gevent.joinall([g1,g2])
print('主程序任務')
相關文章
相關標籤/搜索