列に関する概念
- 先入れ先出しのキュー
- キューの 2 つの基本操作: エンキュー (データをキューの最後に入れる) とデキュー (キューの先頭から要素を取得する)
- キューは、操作が制限された線形テーブル データ構造です。
シーケンシャルキューとチェーンキュー
-
配列で実装されたキューをシーケンシャルキューと呼びます
class Queue: """ 一个简单的队列实现 属性: items(list): 队列数组 """ def __init__(self): """ Queue类的构造函数 参数: 无 返回值: 无 """ self.items = [] def is_empty(self): """ 检查队列是否为空 参数: 无 返回值: True 或 False """ return len(self.items) == 0 def enqueue(self, item): """ 将一个元素添加到队列中 参数: 无 返回值: 添加的元素 """ self.items.append(item) def dequeue(self): """ 将一个元素从队列中移除 参数: 无 返回值: 删除的元素值 """ if self.is_empty(): raise Exception("Queue is empty") return self.items.pop(0)
-
リンクリストを使用して実装されたキューは、チェーンキューと呼ばれます。
class Node: """ 初始化队列中的每个节点。 属性: val (int): 表示节点值。 next (int): 表示下一个节点的指针。 """ def __init__(self, val): """ 节点构造函数。 参数: val: 节点的值。 返回: 无。 """ # val 节点的值 # next 表示下一个节点的指针 self.val = val self.next = None class Queue: """ 实现队列操作。 属性: head (int): 表示队列头部索引的整数。 tail (int): 表示队列尾部索引的整数。 """ def __init__(self): """ 队列构造函数。 参数: 无。 返回: 无。 """ # head 是队列头部节点 self.head = None # tail 是队列尾部节点 self.tail = None def enqueue(self, val): """ 将新元素添加到队列尾部。 参数: val: 要添加到队列尾部的值。 返回: 无。 """ new_node = Node(val) if not self.head: self.head = new_node self.tail = new_node else: self.tail.next = new_node self.tail = new_node def dequeue(self): """ 从队列头部删除元素并返回其值。 参数: 无。 返回: 删除的元素值,如果队列为空则返回 None。 """ # 检查队列是否为空 if not self.head: return None val = self.head.val self.head = self.head.next # 再次判断,确保队列状态正确 if not self.head: self.tail = None return val def is_empty(self): """ 判断队列是否为空。 参数: 无。 返回: 如果队列为空则返回 True,否则返回 False。 """ return self.head is None
スレッド プールにアイドル状態のスレッドがなく、新しいタスクがスレッド リソースを要求した場合、スレッド プールはそれをどのように処理すべきでしょうか? さまざまな処理戦略はどのように実装されますか?
-
タスクリクエストを直接拒否するノンブロッキング処理方式。
-
処理メソッドをブロックし、リクエストをキューに入れ、アイドル状態のスレッドができるまで待機し、キューに入れられたリクエストを取り出して処理を続行します。
-
キュー (配列実装またはリンク リスト実装) を使用して、キューに入れられたリクエストを格納します
1) リンクリストの実装に基づいて、無限キューイングをサポートする無制限のキュー (アンバウンドキュー) を実装できますが、多数のリクエストが整列して待機する可能性があり、リクエスト処理の応答時間が長すぎます。したがって、応答時間に敏感なシステムの場合、リンク リストに基づいて無限にキューに入れられるスレッド プールは適していません。
2)配列によって実装された境界付きキューに基づいて、キューのサイズが制限されるため、スレッド プール内のキューに入れられたリクエストがキュー サイズを超えると、次のリクエストは拒否されます。このメソッドは、スレッド プールの応答時間の影響を受けます。つまり、比較的合理的なシステムです。ただし、適切なキュー サイズの設定も非常に特殊です。キューが大きすぎると、待機中のリクエストが多すぎますが、キューが小さすぎると、システム リソースを十分に活用できず、パフォーマンスを最大化できません。
-
リソースが限られているほとんどのシナリオでは、アイドル状態のリソースがない場合、基本的に「キュー」のデータ構造を使用してリクエスト キューイングを実装できます。
循環キュー
- ポイント:チームが空か満員かを判断する条件を決める
- チーム空判定条件:先頭 == 末尾
- チームフル判定条件:(尾+1)%n==頭
class CircularQueue:
"""
使用列表实现的循环队列。
属性:
queue (list): 用于存储队列元素的列表。
head (int): 表示队列头部索引的整数。
tail (int): 表示队列尾部索引的整数。
maxSize (int): 表示队列的最大大小的整数。
"""
def __init__(self):
"""
CircularQueue类的构造函数。
参数:
无。
返回:
无。
"""
self.queue = []
self.head = 0
self.tail = 0
self.maxSize = 8
def enqueue(self, data):
"""
将一个元素添加到队列中。
参数:
data: 要添加到队列中的数据。
返回:
如果元素成功添加,则返回True;如果队列已满,则返回"Queue Full!"。
"""
# 判断队列是否已满。
if self.size() == self.maxSize - 1:
return "Queue Full!"
self.queue.append(data)
self.tail = (self.tail + 1) % self.maxSize
return True
def dequeue(self):
"""
从队列中移除一个元素。
参数:
无。
返回:
如果队列不为空,则返回从队列中移除的元素;如果队列为空,则返回"Queue Empty!"。
"""
if self.size() == 0:
return "Queue Empty!"
data = self.queue[self.head]
self.head = (self.head + 1) % self.maxSize
return data
def size(self):
"""
计算队列的大小。
参数:
无。
返回:
队列的大小。
"""
if self.tail >= self.head:
return self.tail - self.head
return self.maxSize - (self.head - self.tail)
ブロックキュー
ブロッキング キューは、実際にはキューに基づいてブロッキング操作を追加します。キューがいっぱいの場合、挿入操作は空きができるまでブロックされ、キューが空の場合、削除操作はキュー内に削除する要素ができるまでブロックされます。ブロッキング キューは通常、マルチスレッド シナリオでのタスクのスケジューリングとコラボレーションに使用され、スレッドの実行順序と同時実行性を適切に制御し、スレッド間の競合と競合を回避できます。
-
「プロデューサー/コンシューマー モデル」はブロッキング キューを使用して実装できます。
-
キューのブロッキングに基づいて、「プロデューサー」と「コンシューマー」の数を調整することで、データ処理の効率を向上させることもできます。
同時キュー
同時キューは、複数のスレッドによる同時アクセスをサポートするキューであり、データの不整合や同時実行性の競合を発生させることなく、複数のスレッドでキューに対する挿入や削除などの操作を同時に実行できます。
これを実現する最も簡単かつ直接的な方法は、ロックを enqueue() メソッドと dequeue() メソッドに直接追加することですが、ロックの粒度が大きい場合、同時実行性は比較的低くなり、一度に許可されるストアまたはフェッチ操作は 1 つだけになります。同じ時間です。
- 実際、配列ベースの循環キューは、CAS アトミック操作を使用して、非常に効率的な同時キューを実現できます。