1. 調整檔案結構 變動 import 的路徑與方法
2. 新增 mainOrchestrator.py 作為接下來開發介面化統合工具的主要檔案
This commit is contained in:
+3
-3
@@ -13,12 +13,12 @@ import rclpy
|
||||
from pymavlink import mavutil
|
||||
|
||||
# 自定義的 import
|
||||
from fc_network_adapter import mavlinkObject as mo
|
||||
from fc_network_adapter import mavlinkDevice as md
|
||||
from ..fc_network_adapter import mavlinkObject as mo
|
||||
from ..fc_network_adapter import mavlinkDevice as md
|
||||
|
||||
# ====================== 分割線 =====================
|
||||
|
||||
test_item = 12
|
||||
test_item = 10
|
||||
running_time = 10000
|
||||
|
||||
|
||||
@@ -0,0 +1,152 @@
|
||||
import os
|
||||
import sys
|
||||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
||||
|
||||
import time
|
||||
import threading
|
||||
|
||||
from ..fc_network_adapter.utils import RingBuffer
|
||||
|
||||
|
||||
def producer(buffer, count, interval=0.01):
|
||||
"""生產者:向緩衝區添加資料"""
|
||||
print(f"Producer started (thread {threading.get_ident()})")
|
||||
for i in range(count):
|
||||
# 嘗試寫入數據,直到成功
|
||||
while not buffer.put(f"Item-{i}"):
|
||||
print(f"Buffer full, producer waiting... (thread {threading.get_ident()})")
|
||||
time.sleep(0.1)
|
||||
|
||||
print(f"Produced: Item-{i}, buffer size: {buffer.size()}")
|
||||
time.sleep(interval) # 模擬生產過程
|
||||
|
||||
print(f"Producer finished (thread {threading.get_ident()})")
|
||||
|
||||
def consumer(buffer, max_items, interval=0.05):
|
||||
"""消費者:從緩衝區讀取資料"""
|
||||
print(f"Consumer started (thread {threading.get_ident()})")
|
||||
items_consumed = 0
|
||||
|
||||
while items_consumed < max_items:
|
||||
# 嘗試讀取數據
|
||||
item = buffer.get()
|
||||
if item:
|
||||
print(f"Consumed: {item}, buffer size: {buffer.size()}")
|
||||
items_consumed += 1
|
||||
else:
|
||||
print(f"Buffer empty, consumer waiting... (thread {threading.get_ident()})")
|
||||
|
||||
time.sleep(interval) # 模擬消費過程
|
||||
|
||||
print(f"Consumer finished (thread {threading.get_ident()})")
|
||||
|
||||
def batch_consumer(buffer, interval=0.2):
|
||||
"""批量消費者:一次性讀取緩衝區中的所有資料"""
|
||||
print(f"Batch consumer started (thread {threading.get_ident()})")
|
||||
|
||||
for _ in range(5): # 執行5次批量讀取
|
||||
time.sleep(interval) # 等待緩衝區積累數據
|
||||
items = buffer.get_all()
|
||||
if items:
|
||||
print(f"Batch consumed {len(items)} items: {items}")
|
||||
else:
|
||||
print("Buffer empty for batch consumer")
|
||||
|
||||
print(f"Batch consumer finished (thread {threading.get_ident()})")
|
||||
|
||||
def demonstrate_multi_writer():
|
||||
"""示範多個寫入執行緒同時操作緩衝區"""
|
||||
print("\n=== Demonstrating Multiple Writers ===")
|
||||
buffer = RingBuffer(capacity=80)
|
||||
|
||||
# 創建多個生產者執行緒
|
||||
threads = []
|
||||
for i in range(3):
|
||||
thread = threading.Thread(target=producer, args=(buffer, 5, 0.1 * (i+1)))
|
||||
threads.append(thread)
|
||||
thread.start()
|
||||
|
||||
# 等待所有執行緒完成
|
||||
for thread in threads:
|
||||
thread.join()
|
||||
|
||||
buffer.print_stats() # 印出統計資訊
|
||||
|
||||
# 讀出所有剩餘資料
|
||||
remaining = buffer.get_all()
|
||||
print(f"Remaining items in buffer after multiple writers: {remaining}")
|
||||
|
||||
def demonstrate_basic_usage():
|
||||
"""示範基本使用方式"""
|
||||
print("\n=== Demonstrating Basic Usage ===")
|
||||
# 創建緩衝區
|
||||
buffer = RingBuffer(capacity=20, buffer_id=7)
|
||||
|
||||
# 檢查初始狀態
|
||||
print(f"Initial buffer state - Empty: {buffer.is_empty()}, Full: {buffer.is_full()}, Content Size: {buffer.size()}")
|
||||
|
||||
# 添加幾個項目
|
||||
for i in range(5):
|
||||
buffer.put(f"Test-{i}")
|
||||
|
||||
# 檢查狀態
|
||||
print(f"After adding 5 items - Empty: {buffer.is_empty()}, Full: {buffer.is_full()}, Content Size: {buffer.size()}")
|
||||
|
||||
# 讀取一個項目
|
||||
item = buffer.get()
|
||||
print(f"Read item: {item}")
|
||||
print(f"After reading 1 item - Content Size: {buffer.size()}")
|
||||
|
||||
# 添加更多項目直到滿
|
||||
items_added = 0
|
||||
while not buffer.is_full():
|
||||
buffer.put(f"Fill-{items_added}")
|
||||
items_added += 1
|
||||
|
||||
print(f"Added {items_added} more items until full")
|
||||
print(f"Buffer full state - Empty: {buffer.is_empty()}, Full: {buffer.is_full()}, Content Size: {buffer.size()}")
|
||||
|
||||
# 嘗試添加到已滿的緩衝區
|
||||
result = buffer.put("Overflow")
|
||||
print(f"Attempt to add to full buffer: {'Succeeded' if result else 'Failed'}")
|
||||
|
||||
# 獲取所有項目
|
||||
all_items = buffer.get_all()
|
||||
print(f"All items in buffer: {all_items}")
|
||||
print(f"Buffer after get_all() - Empty: {buffer.is_empty()}, Content Size: {buffer.size()}")
|
||||
|
||||
# 印出統計資訊
|
||||
buffer.print_stats()
|
||||
|
||||
def demonstrate_producer_consumer():
|
||||
"""示範生產者-消費者模式"""
|
||||
print("\n=== Demonstrating Producer-Consumer Pattern ===")
|
||||
buffer = RingBuffer(capacity=16)
|
||||
|
||||
# 創建生產者和消費者執行緒
|
||||
producer_thread = threading.Thread(target=producer, args=(buffer, 20, 0.1))
|
||||
consumer_thread = threading.Thread(target=consumer, args=(buffer, 3, 0.2))
|
||||
batch_thread = threading.Thread(target=batch_consumer, args=(buffer, 0.5))
|
||||
|
||||
# 啟動執行緒
|
||||
producer_thread.start()
|
||||
consumer_thread.start()
|
||||
batch_thread.start()
|
||||
|
||||
# 等待執行緒完成
|
||||
producer_thread.join()
|
||||
consumer_thread.join()
|
||||
batch_thread.join()
|
||||
|
||||
# 檢查最終狀態
|
||||
print(f"Final buffer state - Empty: {buffer.is_empty()}, Size: {buffer.size()}")
|
||||
|
||||
buffer.print_stats()
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 展示各種使用場景
|
||||
# demonstrate_basic_usage()
|
||||
# demonstrate_producer_consumer()
|
||||
demonstrate_multi_writer()
|
||||
|
||||
print("\nAll demonstrations completed!")
|
||||
@@ -16,7 +16,7 @@ import asyncio
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
# 導入要測試的模組
|
||||
from fc_network_adapter.mavlinkObject import (
|
||||
from ..fc_network_adapter.mavlinkObject import (
|
||||
mavlink_object,
|
||||
async_io_manager,
|
||||
MavlinkObjectState,
|
||||
@@ -466,3 +466,4 @@ class TestIntegration(unittest.TestCase):
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main(defaultTest="TestMavlinkObject.test_send_message")
|
||||
# unittest.main(defaultTest="TestAsyncIOManager")
|
||||
|
||||
@@ -1,152 +1,296 @@
|
||||
import os
|
||||
import sys
|
||||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
測試 RingBuffer 類別的功能
|
||||
"""
|
||||
|
||||
import time
|
||||
import unittest
|
||||
import threading
|
||||
import time
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
|
||||
from fc_network_adapter.ringBuffer import RingBuffer
|
||||
from ..fc_network_adapter.utils import RingBuffer
|
||||
|
||||
|
||||
def producer(buffer, count, interval=0.01):
|
||||
"""生產者:向緩衝區添加資料"""
|
||||
print(f"Producer started (thread {threading.get_ident()})")
|
||||
for i in range(count):
|
||||
# 嘗試寫入數據,直到成功
|
||||
while not buffer.put(f"Item-{i}"):
|
||||
print(f"Buffer full, producer waiting... (thread {threading.get_ident()})")
|
||||
time.sleep(0.1)
|
||||
class TestRingBuffer(unittest.TestCase):
|
||||
"""測試 RingBuffer 基本功能"""
|
||||
|
||||
def setUp(self):
|
||||
"""每個測試前的準備"""
|
||||
self.buffer = RingBuffer(capacity=8)
|
||||
|
||||
def test_initialization(self):
|
||||
"""測試初始化"""
|
||||
self.assertEqual(self.buffer.capacity, 8)
|
||||
self.assertTrue(self.buffer.is_empty())
|
||||
self.assertFalse(self.buffer.is_full())
|
||||
self.assertEqual(self.buffer.size(), 0)
|
||||
|
||||
def test_put_get_basic(self):
|
||||
"""測試基本的放入和取出"""
|
||||
# 測試放入
|
||||
self.assertTrue(self.buffer.put("item1"))
|
||||
self.assertTrue(self.buffer.put("item2"))
|
||||
self.assertEqual(self.buffer.size(), 2)
|
||||
self.assertFalse(self.buffer.is_empty())
|
||||
|
||||
print(f"Produced: Item-{i}, buffer size: {buffer.size()}")
|
||||
time.sleep(interval) # 模擬生產過程
|
||||
|
||||
print(f"Producer finished (thread {threading.get_ident()})")
|
||||
|
||||
def consumer(buffer, max_items, interval=0.05):
|
||||
"""消費者:從緩衝區讀取資料"""
|
||||
print(f"Consumer started (thread {threading.get_ident()})")
|
||||
items_consumed = 0
|
||||
|
||||
while items_consumed < max_items:
|
||||
# 嘗試讀取數據
|
||||
item = buffer.get()
|
||||
if item:
|
||||
print(f"Consumed: {item}, buffer size: {buffer.size()}")
|
||||
items_consumed += 1
|
||||
else:
|
||||
print(f"Buffer empty, consumer waiting... (thread {threading.get_ident()})")
|
||||
# 測試取出
|
||||
item1 = self.buffer.get()
|
||||
self.assertEqual(item1, "item1")
|
||||
self.assertEqual(self.buffer.size(), 1)
|
||||
|
||||
time.sleep(interval) # 模擬消費過程
|
||||
item2 = self.buffer.get()
|
||||
self.assertEqual(item2, "item2")
|
||||
self.assertTrue(self.buffer.is_empty())
|
||||
|
||||
# 空緩衝區取出應返回 None
|
||||
self.assertIsNone(self.buffer.get())
|
||||
|
||||
print(f"Consumer finished (thread {threading.get_ident()})")
|
||||
def test_capacity_overflow(self):
|
||||
"""測試緩衝區容量限制"""
|
||||
# 填滿緩衝區 (容量-1,因為需要預留一個位置)
|
||||
for i in range(7): # 8-1=7
|
||||
self.assertTrue(self.buffer.put(f"item{i}"))
|
||||
|
||||
self.assertTrue(self.buffer.is_full())
|
||||
|
||||
# 嘗試再放入一個應該失敗
|
||||
self.assertFalse(self.buffer.put("overflow"))
|
||||
self.assertEqual(self.buffer.overflow_count.value, 1)
|
||||
|
||||
def test_get_all(self):
|
||||
"""測試取出所有項目"""
|
||||
items = ["a", "b", "c", "d"]
|
||||
for item in items:
|
||||
self.buffer.put(item)
|
||||
|
||||
all_items = self.buffer.get_all()
|
||||
self.assertEqual(all_items, items)
|
||||
self.assertTrue(self.buffer.is_empty())
|
||||
|
||||
def test_clear(self):
|
||||
"""測試清空緩衝區"""
|
||||
for i in range(5):
|
||||
self.buffer.put(f"item{i}")
|
||||
|
||||
self.buffer.clear()
|
||||
self.assertTrue(self.buffer.is_empty())
|
||||
self.assertEqual(self.buffer.size(), 0)
|
||||
|
||||
def batch_consumer(buffer, interval=0.2):
|
||||
"""批量消費者:一次性讀取緩衝區中的所有資料"""
|
||||
print(f"Batch consumer started (thread {threading.get_ident()})")
|
||||
|
||||
for _ in range(5): # 執行5次批量讀取
|
||||
time.sleep(interval) # 等待緩衝區積累數據
|
||||
items = buffer.get_all()
|
||||
if items:
|
||||
print(f"Batch consumed {len(items)} items: {items}")
|
||||
else:
|
||||
print("Buffer empty for batch consumer")
|
||||
|
||||
print(f"Batch consumer finished (thread {threading.get_ident()})")
|
||||
|
||||
def demonstrate_multi_writer():
|
||||
"""示範多個寫入執行緒同時操作緩衝區"""
|
||||
print("\n=== Demonstrating Multiple Writers ===")
|
||||
buffer = RingBuffer(capacity=80)
|
||||
class TestRingBufferThreadSafety(unittest.TestCase):
|
||||
"""測試 RingBuffer 的線程安全性"""
|
||||
|
||||
# 創建多個生產者執行緒
|
||||
threads = []
|
||||
for i in range(3):
|
||||
thread = threading.Thread(target=producer, args=(buffer, 5, 0.1 * (i+1)))
|
||||
threads.append(thread)
|
||||
thread.start()
|
||||
def setUp(self):
|
||||
"""每個測試前的準備"""
|
||||
self.buffer = RingBuffer(capacity=256)
|
||||
self.results = []
|
||||
self.write_count = 1000
|
||||
self.read_count = 1000
|
||||
|
||||
# 等待所有執行緒完成
|
||||
for thread in threads:
|
||||
thread.join()
|
||||
def test_concurrent_producers_consumers(self):
|
||||
"""測試多生產者多消費者場景"""
|
||||
self.results = []
|
||||
stats = self.buffer.get_stats()
|
||||
self.assertEqual(stats['total_writes'], 0)
|
||||
|
||||
def producer(producer_id, count):
|
||||
"""生產者函數"""
|
||||
for i in range(count):
|
||||
item = f"producer_{producer_id}_item_{i}"
|
||||
while not self.buffer.put(item):
|
||||
time.sleep(0.001) # 緩衝區滿時稍微等待
|
||||
|
||||
def consumer(consumer_id, count):
|
||||
"""消費者函數"""
|
||||
items = []
|
||||
for _ in range(count):
|
||||
item = None
|
||||
while item is None:
|
||||
item = self.buffer.get()
|
||||
if item is None:
|
||||
time.sleep(0.001) # 緩衝區空時稍微等待
|
||||
items.append(item)
|
||||
self.results.extend(items)
|
||||
|
||||
# 創建多個生產者和消費者
|
||||
with ThreadPoolExecutor(max_workers=8) as executor:
|
||||
# 2 個生產者,每個寫入 500 個項目
|
||||
producer_futures = [
|
||||
executor.submit(producer, 0, 500),
|
||||
executor.submit(producer, 1, 500)
|
||||
]
|
||||
|
||||
# 2 個消費者,每個讀取 500 個項目
|
||||
consumer_futures = [
|
||||
executor.submit(consumer, 0, 500),
|
||||
executor.submit(consumer, 1, 500)
|
||||
]
|
||||
|
||||
# 等待所有任務完成
|
||||
for future in producer_futures + consumer_futures:
|
||||
future.result()
|
||||
|
||||
# 驗證結果
|
||||
self.assertEqual(len(self.results), 1000)
|
||||
self.assertTrue(self.buffer.is_empty())
|
||||
|
||||
# 檢查統計數據
|
||||
stats = self.buffer.get_stats()
|
||||
self.assertEqual(stats['total_writes'], 1000)
|
||||
self.assertGreater(stats['total_reads'], 1000) # 包含失敗的讀取嘗試
|
||||
self.assertGreater(stats['write_threads'], 1)
|
||||
self.assertGreater(stats['read_threads'], 1)
|
||||
|
||||
def test_high_throughput(self):
|
||||
"""測試高吞吐量場景"""
|
||||
items_per_thread = 10000
|
||||
num_threads = 4
|
||||
|
||||
def writer():
|
||||
for i in range(items_per_thread):
|
||||
while not self.buffer.put(i):
|
||||
pass # 忙等待
|
||||
|
||||
def reader():
|
||||
items = []
|
||||
for _ in range(items_per_thread):
|
||||
item = None
|
||||
while item is None:
|
||||
item = self.buffer.get()
|
||||
items.append(item)
|
||||
self.results.extend(items)
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
with ThreadPoolExecutor(max_workers=num_threads * 2) as executor:
|
||||
# 啟動寫入線程
|
||||
writer_futures = [executor.submit(writer) for _ in range(num_threads)]
|
||||
|
||||
# 啟動讀取線程
|
||||
reader_futures = [executor.submit(reader) for _ in range(num_threads)]
|
||||
|
||||
# 等待完成
|
||||
for future in writer_futures + reader_futures:
|
||||
future.result()
|
||||
|
||||
end_time = time.time()
|
||||
|
||||
# 驗證結果
|
||||
total_items = items_per_thread * num_threads
|
||||
self.assertEqual(len(self.results), total_items)
|
||||
|
||||
# 性能統計
|
||||
duration = end_time - start_time
|
||||
throughput = total_items / duration
|
||||
|
||||
print(f"\nHigh Throughput Test Results:")
|
||||
print(f"Total items: {total_items}")
|
||||
print(f"Duration: {duration:.2f}s")
|
||||
print(f"Throughput: {throughput:.0f} items/sec")
|
||||
|
||||
# 顯示詳細統計
|
||||
self.buffer.print_stats()
|
||||
|
||||
buffer.print_stats() # 印出統計資訊
|
||||
|
||||
# 讀出所有剩餘資料
|
||||
remaining = buffer.get_all()
|
||||
print(f"Remaining items in buffer after multiple writers: {remaining}")
|
||||
class TestRingBufferStatistics(unittest.TestCase):
|
||||
"""測試 RingBuffer 的統計功能"""
|
||||
|
||||
def test_statistics_tracking(self):
|
||||
"""測試統計數據追蹤"""
|
||||
buffer = RingBuffer(capacity=16)
|
||||
|
||||
# 寫入一些數據
|
||||
for i in range(10):
|
||||
buffer.put(f"item{i}")
|
||||
|
||||
# 讀取一些數據
|
||||
for _ in range(5):
|
||||
buffer.get()
|
||||
|
||||
stats = buffer.get_stats()
|
||||
|
||||
# 驗證基本統計
|
||||
self.assertEqual(stats['total_writes'], 10)
|
||||
self.assertEqual(stats['total_reads'], 5)
|
||||
self.assertEqual(stats['current_size'], 5)
|
||||
self.assertEqual(stats['write_threads'], 1)
|
||||
self.assertEqual(stats['read_threads'], 1)
|
||||
|
||||
def test_reset_statistics(self):
|
||||
"""測試重置統計數據"""
|
||||
buffer = RingBuffer(capacity=16)
|
||||
|
||||
# 產生一些活動
|
||||
for i in range(5):
|
||||
buffer.put(f"item{i}")
|
||||
for _ in range(3):
|
||||
buffer.get()
|
||||
|
||||
# 重置統計
|
||||
buffer.reset_stats()
|
||||
|
||||
stats = buffer.get_stats()
|
||||
self.assertEqual(stats['total_writes'], 0)
|
||||
self.assertEqual(stats['total_reads'], 0)
|
||||
self.assertEqual(stats['concurrent_writes'], 0)
|
||||
self.assertEqual(stats['concurrent_reads'], 0)
|
||||
self.assertEqual(stats['overflow_count'], 0)
|
||||
|
||||
def demonstrate_basic_usage():
|
||||
"""示範基本使用方式"""
|
||||
print("\n=== Demonstrating Basic Usage ===")
|
||||
# 創建緩衝區
|
||||
buffer = RingBuffer(capacity=20, buffer_id=7)
|
||||
|
||||
# 檢查初始狀態
|
||||
print(f"Initial buffer state - Empty: {buffer.is_empty()}, Full: {buffer.is_full()}, Content Size: {buffer.size()}")
|
||||
|
||||
# 添加幾個項目
|
||||
for i in range(5):
|
||||
buffer.put(f"Test-{i}")
|
||||
|
||||
# 檢查狀態
|
||||
print(f"After adding 5 items - Empty: {buffer.is_empty()}, Full: {buffer.is_full()}, Content Size: {buffer.size()}")
|
||||
|
||||
# 讀取一個項目
|
||||
item = buffer.get()
|
||||
print(f"Read item: {item}")
|
||||
print(f"After reading 1 item - Content Size: {buffer.size()}")
|
||||
|
||||
# 添加更多項目直到滿
|
||||
items_added = 0
|
||||
while not buffer.is_full():
|
||||
buffer.put(f"Fill-{items_added}")
|
||||
items_added += 1
|
||||
|
||||
print(f"Added {items_added} more items until full")
|
||||
print(f"Buffer full state - Empty: {buffer.is_empty()}, Full: {buffer.is_full()}, Content Size: {buffer.size()}")
|
||||
|
||||
# 嘗試添加到已滿的緩衝區
|
||||
result = buffer.put("Overflow")
|
||||
print(f"Attempt to add to full buffer: {'Succeeded' if result else 'Failed'}")
|
||||
|
||||
# 獲取所有項目
|
||||
all_items = buffer.get_all()
|
||||
print(f"All items in buffer: {all_items}")
|
||||
print(f"Buffer after get_all() - Empty: {buffer.is_empty()}, Content Size: {buffer.size()}")
|
||||
|
||||
# 印出統計資訊
|
||||
def benchmark_ringbuffer():
|
||||
"""RingBuffer 性能基準測試"""
|
||||
print("\n=== RingBuffer Performance Benchmark ===")
|
||||
|
||||
buffer = RingBuffer(capacity=1024)
|
||||
num_operations = 100000
|
||||
|
||||
# 單線程性能測試
|
||||
start_time = time.time()
|
||||
for i in range(num_operations):
|
||||
buffer.put(i)
|
||||
for _ in range(num_operations):
|
||||
buffer.get()
|
||||
end_time = time.time()
|
||||
|
||||
single_thread_time = end_time - start_time
|
||||
throughput = (num_operations * 2) / single_thread_time
|
||||
|
||||
print(f"Single Thread: {throughput:.0f} ops/sec")
|
||||
|
||||
# 多線程性能測試
|
||||
buffer = RingBuffer(capacity=1024)
|
||||
|
||||
def producer():
|
||||
for i in range(num_operations // 2):
|
||||
while not buffer.put(i):
|
||||
pass
|
||||
|
||||
def consumer():
|
||||
for _ in range(num_operations // 2):
|
||||
while buffer.get() is None:
|
||||
pass
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
with ThreadPoolExecutor(max_workers=2) as executor:
|
||||
future1 = executor.submit(producer)
|
||||
future2 = executor.submit(consumer)
|
||||
future1.result()
|
||||
future2.result()
|
||||
|
||||
end_time = time.time()
|
||||
|
||||
multi_thread_time = end_time - start_time
|
||||
throughput = num_operations / multi_thread_time
|
||||
|
||||
print(f"Multi Thread: {throughput:.0f} ops/sec")
|
||||
print(f"Speedup: {single_thread_time/multi_thread_time:.2f}x")
|
||||
|
||||
buffer.print_stats()
|
||||
|
||||
def demonstrate_producer_consumer():
|
||||
"""示範生產者-消費者模式"""
|
||||
print("\n=== Demonstrating Producer-Consumer Pattern ===")
|
||||
buffer = RingBuffer(capacity=16)
|
||||
|
||||
# 創建生產者和消費者執行緒
|
||||
producer_thread = threading.Thread(target=producer, args=(buffer, 20, 0.1))
|
||||
consumer_thread = threading.Thread(target=consumer, args=(buffer, 3, 0.2))
|
||||
batch_thread = threading.Thread(target=batch_consumer, args=(buffer, 0.5))
|
||||
|
||||
# 啟動執行緒
|
||||
producer_thread.start()
|
||||
consumer_thread.start()
|
||||
batch_thread.start()
|
||||
|
||||
# 等待執行緒完成
|
||||
producer_thread.join()
|
||||
consumer_thread.join()
|
||||
batch_thread.join()
|
||||
|
||||
# 檢查最終狀態
|
||||
print(f"Final buffer state - Empty: {buffer.is_empty()}, Size: {buffer.size()}")
|
||||
|
||||
buffer.print_stats()
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 展示各種使用場景
|
||||
# demonstrate_basic_usage()
|
||||
# demonstrate_producer_consumer()
|
||||
demonstrate_multi_writer()
|
||||
# 運行單元測試
|
||||
unittest.main(argv=[''], exit=False, verbosity=2)
|
||||
|
||||
print("\nAll demonstrations completed!")
|
||||
# 運行性能基準測試
|
||||
benchmark_ringbuffer()
|
||||
Reference in New Issue
Block a user