好友
阅读权限10
听众
最后登录1970-1-1
|
为了完成你的需求,我们需要设计一个数据表来存储任务、处理任务的分发、接收客户端的结果,并更新任务状态。以下是一个基本的Python示例和MySQL数据表设计。
MySQL数据表设计
首先,我们创建一个名为tasks的表来存储任务信息:
sql
CREATE TABLE tasks (
id INT AUTO_INCREMENT PRIMARY KEY,
expression VARCHAR(255) NOT NULL, -- 存放如 '1+2' 这样的表达式
status ENUM('pending', 'completed') NOT NULL DEFAULT 'pending', -- 任务状态:待处理或已完成
result VARCHAR(255) DEFAULT NULL, -- 存放计算结果
completed_at TIMESTAMP DEFAULT NULL -- 完成时间
);
Python代码示例
以下是使用Python和MySQL交互的示例代码。在这个例子中,我假设你使用了mysql-connector-python库来连接MySQL数据库,并且使用了flask作为HTTP服务器来处理客户端的请求。如果你选择使用Socket进行通信,则需要替换相应的通信代码。
首先,确保安装了必要的库:
bash
pip install mysql-connector-python flask
然后是Python代码:
python
from flask import Flask, request, jsonify
import mysql.connector
import threading
import time
app = Flask(__name__)
# MySQL连接配置
config = {
'user': 'your_username',
'password': 'your_password',
'host': '127.0.0.1',
'database': 'your_database',
'raise_on_warnings': True
}
# 连接到MySQL
cnx = mysql.connector.connect(**config)
cursor = cnx.cursor()
# 获取待处理任务
def get_pending_tasks(num_tasks):
query = ("SELECT id, expression FROM tasks WHERE status = %s LIMIT %s")
cursor.execute(query, ('pending', num_tasks))
return cursor.fetchall()
# 更新任务状态并保存结果
def update_task(task_id, result):
query = ("UPDATE tasks SET status = %s, result = %s, completed_at = NOW() WHERE id = %s")
cursor.execute(query, ('completed', str(result), task_id))
cnx.commit()
# 客户端提交结果
@app.route('/submit_result', methods=['POST'])
def submit_result():
data = request.get_json()
task_id = data['task_id']
result = data['result']
update_task(task_id, result)
return jsonify({'status': 'success', 'message': 'Result submitted successfully.'}), 200
# 分发任务给客户端(这里为了简单起见,模拟客户端立即返回结果)
def distribute_tasks(num_tasks):
pending_tasks = get_pending_tasks(num_tasks)
for task_id, expression in pending_tasks:
# 这里应该有一个实际的客户端调用逻辑,比如通过Socket发送任务
# 这里我们模拟客户端直接返回结果
result = eval(expression) # 注意:eval在实际应用中是不安全的,这里仅为示例
update_task(task_id, result)
print(f"Task {task_id} with expression {expression} completed with result {result}")
# 添加任务的函数
def add_task(expression):
query = ("INSERT INTO tasks (expression) VALUES (%s)")
cursor.execute(query, (expression,))
cnx.commit()
# 启动任务分发线程(实际应用中可能需要更复杂的逻辑,比如使用队列和消息中间件)
def start_task_distributor():
while True:
distribute_tasks(10) # 每次分发10个任务,这个值可以根据实际需要进行调整
time.sleep(5) # 每5秒分发一次任务,这个值可以根据实际需要进行调整
# 启动分发线程
distributor_thread = threading.Thread(target=start_task_distributor)
distributor_thread.start()
# 启动Flask应用
if __name__ == '__main__':
app.run(debug=True)
注意点
CS之间通信:上面的示例使用了HTTP POST通过Flask接收客户端的结果。如果你选择使用Socket,你需要实现Socket服务器和客户端的逻辑来替代Flask部分。
多线程:示例中使用了Python的threading模块来创建一个单独的线程用于分发任务。这只是一个简单的 |
|