第二题用Python的高级写法做出来,注意添加注释
时间: 2024-12-28 07:33:20 浏览: 5
好的,以下是使用 Python 高级写法实现的日志上传功能。该实现采用了发布/订阅模式,以确保在整个项目中高效地管理日志上传任务。
```python
import threading
import time
from collections import deque
class Logger:
def __init__(self, timer=60, count=100):
"""
初始化日志类
:param timer: 每隔多少秒上传一次日志
:param count: 累积多少条日志后上传一次
"""
self.timer = timer
self.count = count
self.log_queue = deque()
self.lock = threading.Lock()
self.stop_event = threading.Event()
def log(self, message):
"""
记录一条日志
:param message: 日志消息
"""
with self.lock:
self.log_queue.append(message)
if len(self.log_queue) >= self.count:
self.upload_logs()
def upload_logs(self):
"""
上传日志
"""
with self.lock:
logs_to_upload = list(self.log_queue)
self.log_queue.clear()
# 模拟日志上传操作
print(f"Uploading {len(logs_to_upload)} logs")
for log in logs_to_upload:
print(log)
def start_timer(self):
"""
开始定时器,定期上传日志
"""
while not self.stop_event.is_set():
time.sleep(self.timer)
if self.log_queue:
self.upload_logs()
def start(self):
"""
启动日志记录和上传
"""
timer_thread = threading.Thread(target=self.start_timer)
timer_thread.daemon = True
timer_thread.start()
def stop(self):
"""
停止日志记录和上传
"""
self.stop_event.set()
self.upload_logs() # 最后一次上传剩余日志
# 示例使用
if __name__ == "__main__":
logger = Logger(timer=5, count=5) # 每5秒或累积5条日志上传一次
logger.start()
# 模拟生成日志
for i in range(20):
logger.log(f"Log message {i}")
time.sleep(1)
# 停止日志记录
logger.stop()
```
### 代码说明
1. **Logger 类**:
- `__init__`: 初始化日志类,设置定时器间隔 `timer` 和日志数量阈值 `count`。
- `log`: 记录一条日志,如果队列中的日志数量达到阈值 `count`,则调用 `upload_logs` 方法上传日志。
- `upload_logs`: 从队列中取出所有日志并上传。
- `start_timer`: 定时器线程,每隔 `timer` 秒检查一次日志队列,如果有日志则上传。
- `start`: 启动日志记录和上传,创建并启动定时器线程。
- `stop`: 停止日志记录和上传,设置停止事件并上传剩余日志。
2. **示例使用**:
- 创建 `Logger` 实例,设置每5秒或累积5条日志上传一次。
- 启动日志记录和上传。
- 模拟生成20条日志,每条日志之间间隔1秒。
- 停止日志记录和上传。
这种实现方式利用了多线程和锁机制,确保了日志记录和上传的高效性和安全性。希望这对你有所帮助!
阅读全文