自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python數(shù)據(jù)結(jié)構(gòu)與算法—優(yōu)先級(jí)隊(duì)列Queue

開(kāi)發(fā) 后端 算法
queue庫(kù)提供了一個(gè)適用于多線程編程的先進(jìn)先出(FIFO)數(shù)據(jù)結(jié)構(gòu),可以用來(lái)在生產(chǎn)者與消費(fèi)者線程之間安全地傳遞消息或其他數(shù)據(jù)。它會(huì)為調(diào)用者處理鎖定,使多個(gè)線程可以安全而更容易地處理同一個(gè)Queue實(shí)例。Queue的大小可能受限,以限制內(nèi)存使用或處理。

[[405132]]

前言

queue庫(kù)提供了一個(gè)適用于多線程編程的先進(jìn)先出(FIFO)數(shù)據(jù)結(jié)構(gòu),可以用來(lái)在生產(chǎn)者與消費(fèi)者線程之間安全地傳遞消息或其他數(shù)據(jù)。

它會(huì)為調(diào)用者處理鎖定,使多個(gè)線程可以安全而更容易地處理同一個(gè)Queue實(shí)例。Queue的大小可能受限,以限制內(nèi)存使用或處理。

基本用法

Queue類實(shí)現(xiàn)了一個(gè)基本的先進(jìn)先出容器。使用put()將元素增加到這個(gè)序列的一端,使用get()從另一端刪除。具體代碼如下所示:

  1. import queue 
  2.  
  3. q = queue.Queue() 
  4.  
  5. for i in range(1, 10): 
  6.     q.put(i) 
  7. while not q.empty(): 
  8.     print(q.get(), end="  "

 運(yùn)行之后,效果如下:

這里我們依次添加1到10到隊(duì)列中,因?yàn)橄冗M(jìn)先出,所以出來(lái)的順序也與添加的順序相同。

LIFO隊(duì)列

既然有先進(jìn)先出隊(duì)列queue,那么數(shù)據(jù)結(jié)構(gòu)中肯定也有后進(jìn)先出的隊(duì)列。后進(jìn)先出的隊(duì)列為:LifoQueue,示例如下:

  1. import queue 
  2.  
  3. q = queue.LifoQueue() 
  4.  
  5. for i in range(1, 10): 
  6.     q.put(i) 
  7. while not q.empty(): 
  8.     print(q.get(), end="  "

 運(yùn)行之后,效果如下:

 

優(yōu)先隊(duì)列

在操作系統(tǒng)中,我們常常會(huì)根據(jù)優(yōu)先級(jí)來(lái)處理任務(wù),比如系統(tǒng)的優(yōu)先級(jí)最高,我們肯定優(yōu)先處理系統(tǒng)任務(wù),然后才處理用戶的任務(wù)。同樣,queue庫(kù)給我們提供了PriorityQueue來(lái)處理優(yōu)先級(jí)的隊(duì)列。

示例如下:

  1. import queue 
  2. import threading 
  3.  
  4. class Job: 
  5.     def __init__(self, priority, desc): 
  6.         self.priority = priority 
  7.         self.desc = desc 
  8.         print("New Job:"desc
  9.         return 
  10.  
  11.     def __eq__(self, other): 
  12.         try: 
  13.             return self.priority == other.priority 
  14.         except AttributeError: 
  15.             return NotImplemented 
  16.  
  17.     def __lt__(self, other): 
  18.         try: 
  19.             return self.priority > other.priority 
  20.         except AttributeError: 
  21.             return NotImplemented 
  22.  
  23. def process_Job(q): 
  24.     while True
  25.         next_job = q.get() 
  26.         print(next_job.desc
  27.         q.task_done() 
  28.  
  29. q = queue.PriorityQueue() 
  30.  
  31. q.put(Job(5, "Five Job")) 
  32. q.put(Job(15, "Fifteen Job")) 
  33. q.put(Job(1, "One Job")) 
  34.  
  35. workers = [ 
  36.     threading.Thread(target=process_Job, args=(q,)), 
  37.     threading.Thread(target=process_Job, args=(q,)), 
  38.  
  39. for work in workers: 
  40.     work.setDaemon(True
  41.     work.start() 
  42.  
  43. q.join() 

 運(yùn)行之后,效果如下:

這里,我們默認(rèn)數(shù)值越大優(yōu)先級(jí)越高,可以看到15先執(zhí)行,然后再是5,1任務(wù)。這個(gè)例子展現(xiàn)了有多個(gè)線程在處理任務(wù)時(shí),要根據(jù)get()時(shí)隊(duì)列中元素的優(yōu)先級(jí)來(lái)處理。

 

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2020-10-17 11:14:19

數(shù)據(jù)結(jié)構(gòu)與算法系列

2021-03-09 06:30:32

JAVA數(shù)據(jù)結(jié)構(gòu)算法

2023-08-08 08:28:03

消息消費(fèi)端Spring

2009-08-11 14:43:42

C#數(shù)據(jù)結(jié)構(gòu)與算法

2023-04-14 08:07:20

數(shù)據(jù)結(jié)構(gòu)算法搜索

2021-07-16 07:57:34

Python數(shù)據(jù)結(jié)構(gòu)

2020-10-21 14:57:04

數(shù)據(jù)結(jié)構(gòu)算法圖形

2020-11-25 14:28:56

DelayedWork

2023-03-08 08:03:09

數(shù)據(jù)結(jié)構(gòu)算法歸并排序

2023-10-27 07:04:20

2023-09-26 12:22:37

隊(duì)列Python

2023-03-02 08:15:13

2023-03-10 08:07:39

數(shù)據(jù)結(jié)構(gòu)算法計(jì)數(shù)排序

2023-09-25 12:23:18

Python

2012-08-14 09:38:29

WAN優(yōu)化

2024-03-11 07:46:40

React優(yōu)先級(jí)隊(duì)列二叉堆

2023-03-07 08:02:07

數(shù)據(jù)結(jié)構(gòu)算法數(shù)列

2023-04-27 09:13:20

排序算法數(shù)據(jù)結(jié)構(gòu)

2023-03-13 10:08:31

數(shù)據(jù)結(jié)構(gòu)算法

2023-11-06 06:43:23

單鏈表查詢數(shù)據(jù)結(jié)構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)