import subprocessimport timeimport psutilfrom flask import Flask render_template request jsonifyfrom flask_socketio import SocketIOapp = Flask__name__ template_folder=DpythonwebpingappconfigSECRET_KEY
请参考下面的代码,实现多个进程在不同的端口上开启多个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 字典中移除
原文地址: http://www.cveoy.top/t/topic/iSZP 著作权归作者所有。请勿转载和采集!