请参考下面的代码,实现多个进程在不同的端口上开启多个iperf3服务。

import subprocess
import time
import psutil

from flask import Flask, render_template, request, jsonify
from flask_socketio import SocketIO

app = Flask(__name__, template_folder='D:\\python\\webping')
app.config['SECRET_KEY'] = 'secret_key'
socketio = SocketIO(app)

processes = {}


@app.route('/')
def index():
    return render_template('index.html')


@app.route('/start', methods=['POST'])
def start():
    port = request.json['port']
    if port in processes:
        return jsonify({'message': f'Command already running on port {port}.'})

    # Kill iperf3 process on the specified port before starting a new one
    for proc in psutil.process_iter():
        if proc.name() == 'iperf3' and f'-p {port}' in proc.cmdline():
            proc.kill()

    process = subprocess.Popen(['iperf3', '-s', '-p', str(port), '-i', '1'], stdout=subprocess.PIPE, universal_newlines=True)
    processes[port] = process

    def stream():
        i = 0
        while process and process.poll() is None:
            output = process.stdout.readline().strip()
            if len(output)>0:
                i += 1
                print(i, output)

                socketio.emit('stream_output', output)
                # time.sleep(0.1)

        processes.pop(port)

    socketio.start_background_task(stream)
    return jsonify({'message': f'Command started on port {port}.'})


@app.route('/stop', methods=['POST'])
def stop():
    port = request.json['port']
    if port in processes:
        process = processes[port]
        process.terminate()
        processes.pop(port)
        return jsonify({'message': f'Command stopped on port {port}.'})
    else:
        return jsonify({'message': f'No command running on port {port}.'})


if __name__ == '__main__':
    socketio.run(app, host='0.0.0.0', port=5000, debug=False, allow_unsafe_werkzeug=True)

这段代码中,使用一个字典 processes 来保存每个进程的端口号和对应的进程对象。在 /start 路由中,首先检查指定端口是否已经有进程在运行,如果是则返回错误信息。然后使用 subprocess.Popen 开启一个新的iperf3进程,并将其加入到 processes 字典中。在 /stop 路由中,首先检查指定端口是否有进程在运行,如果有则终止进程并从 processes 字典中移除

import subprocessimport timeimport psutilfrom flask import Flask render_template request jsonifyfrom flask_socketio import SocketIOapp = Flask__name__ template_folder=DpythonwebpingappconfigSECRET_KEY

原文地址: http://www.cveoy.top/t/topic/iSZP 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录