modify: 协程调度器
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
from .example import async_example
|
||||
|
||||
__all__ = ["async_example"]
|
||||
@@ -0,0 +1,19 @@
|
||||
from queue_sqlite.mounter.task_mounter import TaskMounter
|
||||
from queue_sqlite.model import MessageItem
|
||||
|
||||
|
||||
@TaskMounter.task(meta={"task_name": "test"})
|
||||
async def async_example(message_item: MessageItem):
|
||||
def fibonacci_generator():
|
||||
a, b = 0, 1
|
||||
while True:
|
||||
yield a
|
||||
a, b = b, a + b
|
||||
|
||||
# 示例:获取前10项
|
||||
fib = fibonacci_generator()
|
||||
message_item.result = {"fibonacci": [next(fib) for _ in range(500)]}
|
||||
return message_item.to_json()
|
||||
|
||||
|
||||
# 输出:[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
|
||||
@@ -0,0 +1,75 @@
|
||||
from queue_sqlite.model import MessageItem
|
||||
from queue_sqlite.scheduler import QueueScheduler
|
||||
import time
|
||||
from async_taks import *
|
||||
import threading
|
||||
import psutil
|
||||
|
||||
|
||||
class TestAsyncScheduler:
|
||||
|
||||
callback_counter = 0
|
||||
lock = threading.Lock()
|
||||
is_monitoring = False
|
||||
|
||||
@classmethod
|
||||
def monitor_resources(cls):
|
||||
"""监控资源使用情况"""
|
||||
while cls.is_monitoring:
|
||||
cpu = psutil.cpu_percent()
|
||||
memory = psutil.virtual_memory().percent
|
||||
print(f"CPU使用率: {cpu}%, 内存使用率: {memory}%")
|
||||
time.sleep(0.5)
|
||||
|
||||
@classmethod
|
||||
async def _callback(cls, message_item: MessageItem):
|
||||
with cls.lock:
|
||||
cls.callback_counter += 1
|
||||
# print(f"callback: {message_item}")
|
||||
# print(f"callback: {message_item.id}")
|
||||
# print(f"callback: {message_item.expire_time}")
|
||||
# print(f"callback: {message_item.tags}")
|
||||
|
||||
@classmethod
|
||||
def test_async_scheduler(cls):
|
||||
"""测试异步调度器"""
|
||||
TASK_NUM = 10000
|
||||
messages = []
|
||||
for i in range(TASK_NUM):
|
||||
message_item = MessageItem(content={"num": i}, destination="async_example")
|
||||
messages.append(message_item)
|
||||
|
||||
cls.is_monitoring = True
|
||||
monitor_thread = threading.Thread(target=cls.monitor_resources, daemon=True)
|
||||
monitor_thread.start()
|
||||
queue_scheduler = QueueScheduler(
|
||||
receive_thread_num=4,
|
||||
task_thread_num=8,
|
||||
shard_num=12,
|
||||
scheduler_type="async",
|
||||
)
|
||||
|
||||
start_time = time.perf_counter()
|
||||
queue_scheduler.start()
|
||||
|
||||
for message_item in messages:
|
||||
message_item: MessageItem
|
||||
queue_scheduler.send_message(message_item, cls._callback)
|
||||
|
||||
while (
|
||||
queue_scheduler.queue_operation.get_queue_length() > 0
|
||||
or cls.callback_counter < TASK_NUM
|
||||
): # 30秒超时
|
||||
time.sleep(0.5)
|
||||
print(f"当前队列长度:{queue_scheduler.queue_operation.get_queue_length()}")
|
||||
print(f"当前回调数量:{cls.callback_counter}")
|
||||
|
||||
queue_scheduler.stop()
|
||||
|
||||
print(f"当前队列长度:{queue_scheduler.queue_operation.get_queue_length()}")
|
||||
print(f"测试函数:斐波那契数列")
|
||||
print(f"次数:{TASK_NUM}")
|
||||
print(f"总耗时: {time.perf_counter() - start_time:.2f}秒")
|
||||
|
||||
cls.is_monitoring = False
|
||||
monitor_thread.join(timeout=1)
|
||||
Reference in New Issue
Block a user