(三十四)線程的隊列,協程

1、線程的其餘方法html

1.threading.current_thread()獲取對象可使用的方法
def fn():
    pass
t = Thread(target=fn,)
t.start()
obj = threading.current_thread()
print(obj.getName(), obj.name)
print(obj.ident)

  2.threading直接可使用的方法 python

 

print(threading.enumerate())#獲取當前活躍的線程的列表
print(threading.active_count())#獲取當前活躍的線程的總數

 

  

2、線程隊列網絡

  1. 普通隊列
import queue
q = queue.Queue(5)#不給數量,這個隊列就是無限大的
q.put(1)
q.put(2)
q.put(3)
q.put(4)
q.put(5)
#print(q.full())#判斷隊列是否已滿,不過有時不太準確
#print(q.qsize())#獲取隊列中元素的的數量,其實這個方法裏面裏面也是使用的len()函數
try:
    # q.put(6)#若是隊列裝滿了,會一直停留在這裏
    q.put_nowait(6)#若是隊列滿了,會報錯,使用try後,能夠抓取異常,而後繼續向下執行
except Exception:
    print('zhe queue is full')
#print(q.empty())#查看隊列是否已空,不過有時不太準確
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())
try:
    print(q.get())
except Exception:
    print('zhe queue is empty')

  

   2.LifoQueue--先進後出隊列,獲取順序相似棧app

這就是一個繼承了Queue的列表,其餘的方法就是繼承於Queueasync

 

q = queue.LifoQueue(3)
q.put(1)#添加數據就是向列表裏append()數據
q.put(2)
q.put(3)

print(q.get())#就是使用pop()刪除列表
print(q.get())
print(q.get())
結果:
3
2
1

 

  

第一步初始化一個列表:ide

def _init(self, maxsize):
    self.queue = []

  

第二步添加數據:函數

def _put(self, item):
    self.queue.append(item)

  

第三部刪除數據:url

def _get(self):
    return self.queue.pop()

  

3.PriorityQueue--優先級隊列spa

 

q = queue.PriorityQueue()
q.put((3,'4'))
q.put((2,3))
q.put((1,'d'))
q.put((5,'s'))
q.put((4,'w'))

print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())
結果:
(1, 'd')
(2, 3)
(3, '4')
(4, 'w')
(5, 's')

 

  

結果按照元組中第一個元素的ASCII碼的升序排序後輸出,若是第一元素相等,就按照第二個元素的ASCII碼的升序排列,以此類推。可是,字典元素不可比較。相對應比較的兩個元素必須是同類型的。線程

優先級隊列也是一個列表:

def _init(self, maxsize):
    self.queue = []

  

就是增長和獲取時,與列表有些區別。

3、線程池

  1. ThreadPoolExecutor

(1) map

def f(n):
    time.sleep(0.5)
    print(n)
t = ThreadPoolExecutor(4)  # 默認數量是,CPU個數的5倍
t.map(f, range(10))

  

(2)submit()

def f(n):
    time.sleep(0.3)
    # print(n)
    return n**2
Def fn(m):
Print(m)
t = ThreadPoolExecutor(4)  # 默認數量是,CPU個數的5倍
t_lst = []
for i in range(10):
    #功能後面的參數是無敵傳參,*args,**kwargs,傳遞實參的個數不限制,可是形參的個數與形式也要跟實參的一一對應上
    res = t.submit(f, n=i)
#t.submit()..add_done_callback(fn)#回調函數

    #print(res)#返回的是結果對象
    # print(res.result())#這也是一個不拿到結果,誓不罷休的方法
    t_lst.append(res)

# for th in t_lst:#在shutdown()以前是每四個一次顯示出來
#     print(th.result())

# 至關於進程池的close()和join()兩個方法,其實裏面是讓每一個線程都調用了join().
t.shutdown()

for th in t_lst:#會一會兒展現出來數據
    print(th.result())

  

2.ProcessPoolExecutor

   ThreadPoolExcutor的使用方法同樣大的。

 

4、協程

 

協程是線程裏最小的執行單元。首先得下載兩個模塊--greenletgevent

 

  1. greenlet

 

from greenleet import greenlet

def f1():
    print('f1---1111')
    g2.switch()
    print('f1---2222')
def f2():
    print('f2---1111')
    g1.switch()

g1 = greenlet(f1)
g2 = greenlet(f2)
g1.switch()

結果:
f1---1111
f2---1111
f1---2222

def f1(c):
    print('f1---1111',c)
    g2.switch('Tom')
    print('f1---2222',c)
def f2(c):
    print('f2---1111',c)
    g1.switch()#此處也能夠添加參數,結果和如今就不同了,能夠試試看
g1 = greenlet(f1)
g2 = greenlet(f2)
g1.switch('TOM')
結果:
f1---1111 TOM
f2---1111 Tom
f1---2222 TOM

  

greenlet利用switch切換,執行不一樣代碼塊的功能。

 

2.gevent

def f1():
    print('f1---11111')
    gevent.sleep(1)
#time.sleep(1)
    print('f1---22222')

def f2():
    print('f2---11111')
    gevent.sleep(2)
#time.sleep(1)
    print('f2---2222')
    
g1 = gevent.spawn(f1)
g2 = gevent.spawn(f2)

g1.join()#須要有
g2.join()
#gevent.joinall([g1,g2])#至關於上面的兩個一塊兒

  

gevent只識別本身的sleep()time.sleep()不能被識別。爲了相似time.sleep()這樣的阻塞被識別(還有input(),打開文件,文件或網絡讀取數據等),使用下面的方式:

 

from gevent import monkey; monkey.patch_all()這句話放到文件的開頭。

 例子:

from gevent import monkey; monkey.patch_all()
import gevent
import requests
def eat(name):
    print('%s eat 1' %name)
    # gevent.sleep(0.002)
    content = requests.get(url="https://www.baidu.com").text
    print("------->>>", content)
    print('%s eat 2' %name)

def play(name):
    print('%s play 1' %name)
    # gevent.sleep(0.001)
    content = requests.get(url="https://www.sogou.com/")
    print(">>>>>>>>", content)
    print('%s play 2' %name)


g1=gevent.spawn(eat,'lisi')
g2=gevent.spawn(play,name='zhangsan')
g1.join()
g2.join()
#或者gevent.joinall([g1,g2])
print('主')

  

例子:

from gevent import spawn,joinall,monkey;monkey.patch_all()
import time
def task(pid):
    """
    Some non-deterministic task
    """
    time.sleep(0.5)
    print('Task %s done' % pid)

def synchronous():
    for i in range(10):
        task(i)

def asynchronous():
    g_l=[spawn(task,i) for i in range(10)]
    joinall(g_l)

if __name__ == '__main__':
    s1 = time.time()
    print('Synchronous:')
    synchronous()
    print("11===", time.time() - s1) # 5.021262884140015

    s2 = time.time()
    print('Asynchronous:')
    asynchronous()
    print("22===", time.time() - s2) # 0.5015802383422852

  

  

  

Python查看API:https://docs.python.org/3.7/library/os.html
相關文章
相關標籤/搜索