吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 221|回复: 2
收起左侧

[其他求助] 需要一个用Python写的一个CS架构模型

[复制链接]
bester 发表于 2024-3-12 15:16
200吾爱币
本帖最后由 bester 于 2024-3-12 15:18 编辑

由于我要写的东西我有很多东西不大明白,所以大概看一下各位大佬是怎么解决问题的
需要提供python源码

需求如下:
我用的是mysql,服务端查询数据库是否有计算任务,比如有10道加减法的任务,将10道加减法的依次派发给客户端,客户端执行到的结果,给回服务端,服务端将结果写到mysql ,要把任务划掉,并标注每个任务几点完成
如果不划掉,下一次又会重复这个任务,然后计算任务是不定时添加上去的,比如第一次我添加是10道,第二次可能就是5道这样子,但是要把结果对应起来,比如我第一个任务是1+2,第二个任务是3-2,不能将第二个任务的结果放在第一个


举个例子:
服务端有个方法,添加任务,比如任务是加减法计算,我不定时添加一个1+1,或者是2+2到mysql,然后服务端负责把任务给客户端,客户端计算好结果,丢给服务端,然后服务端把结果写到mysql就可以了,再把这个任务划掉

需要考虑的点
1.CS之间通信用HTTP POST?还是Socket?
2.多线程,因为分发给客户端的任务是多个的,不能做完一个再做下一个,再把结果传递回来,这样的话要传10次,效率太低了
3.任务怎么设计?放在数据库还是放在服务端比较和?如果是放在服务端,我怎么把任务提交给服务端呢?我想的是任务肯定是要有一个临时存放的地方,所以我想的是放在数据库比较方便,至于C和S谁去轮询是否有任务,这个大家提一下意见
4.任务怎么存放?比如1+2和3-4,你在数据库怎么存放,是直接存放字符串,然后服务端解析还是怎样?
5.完成的任务怎么划掉,我就这个有点想不明白,重点是划掉了这个任务 我还想要知道这个任务的完成时间 能在数据库有体现
6.我想知道如何设计这个数据表

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wwwyangood 发表于 2024-3-12 17:35
为了完成你的需求,我们需要设计一个数据表来存储任务、处理任务的分发、接收客户端的结果,并更新任务状态。以下是一个基本的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模块来创建一个单独的线程用于分发任务。这只是一个简单的
kings0b 发表于 2024-3-12 20:28
import mysql.connector
from mysql.connector import Error
from concurrent.futures import ThreadPoolExecutor
import requests

# 连接到MySQL数据库
def create_connection():
    connection = None
    try:
        connection = mysql.connector.connect(
            host='localhost',
            database='your_database_name',
            user='your_username',
            password='your_password'
        )
        print('Connected to MySQL database')
    except Error as e:
        print(f'Error connecting to MySQL database: {e}')

    return connection

# 从数据库中获取未完成的任务
def get_pending_tasks(connection):
    tasks = []
    try:
        cursor = connection.cursor()
        cursor.execute('SELECT id, task FROM tasks WHERE status = "pending"')
        rows = cursor.fetchall()
        for row in rows:
            task_id, task = row
            tasks.append({'id': task_id, 'task': task})
    except Error as e:
        print(f'Error retrieving tasks from database: {e}')

    return tasks

# 更新任务状态和完成时间
def update_task(connection, task_id, result):
    try:
        cursor = connection.cursor()
        cursor.execute('UPDATE tasks SET status = "completed", result = %s, completion_time = NOW() WHERE id = %s', (result, task_id))
        connection.commit()
        print(f'Task {task_id} updated')
    except Error as e:
        print(f'Error updating task {task_id}: {e}')

# 提交任务给客户端
def dispatch_task(task):
    url = 'http://client_url/task'  # 替换为实际的客户端URL
    payload = {'task': task['task']}
    try:
        response = requests.post(url, data=payload)
        if response.status_code == 200:
            result = response.text
            update_task(connection, task['id'], result)
    except requests.exceptions.RequestException as e:
        print(f'Error dispatching task to client: {e}')

# 主函数
def main():
    connection = create_connection()
    if connection is None:
        return

    # 使用线程池处理任务
    executor = ThreadPoolExecutor(max_workers=5)
   
    while True:
        tasks = get_pending_tasks(connection)
        if len(tasks) == 0:
            print('No pending tasks')
            break

        for task in tasks:
            executor.submit(dispatch_task, task)

    connection.close()

if __name__ == '__main__':
    main()
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-14 05:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表