yeq6x commited on
Commit
7af3031
·
1 Parent(s): db52736
Files changed (1) hide show
  1. app.py +14 -9
app.py CHANGED
@@ -1,5 +1,5 @@
1
  from flask import Flask, request, render_template, send_file, jsonify, send_from_directory
2
- from flask_socketio import SocketIO, emit
3
  from flask_cors import CORS
4
  from flask_limiter import Limiter
5
  from flask_limiter.util import get_remote_address
@@ -54,11 +54,12 @@ class Task:
54
  self.is_processing = False
55
 
56
  # キューの状態を通知
57
- def update_queue_status(message=None, client_ip=None):
58
- socketio.emit('queue_update', {'active_tasks': len(active_tasks), 'message': message}, room=client_ip)
59
 
60
  def process_task(task):
61
  try:
 
62
  task.is_processing = True
63
  # ファイルデータをPIL Imageに変換
64
  image = Image.open(io.BytesIO(task.file_data))
@@ -79,10 +80,10 @@ def process_task(task):
79
  'task_id': task.task_id,
80
  'sotai_image': sotai_image,
81
  'sketch_image': sketch_image
82
- }, room=task.client_ip)
83
  except Exception as e:
84
  if not task.cancel_flag:
85
- socketio.emit('task_error', {'task_id': task.task_id, 'error': str(e)}, room=task.client_ip)
86
  finally:
87
  task.is_processing = False
88
  if task.task_id in active_tasks:
@@ -115,16 +116,17 @@ threading.Thread(target=worker, daemon=True).start()
115
  # グローバル変数を使用して接続数とタスク数を管理
116
  connected_clients = 0
117
  tasks_per_client = {}
118
-
119
  @socketio.on('connect')
120
  def handle_connect(auth):
 
 
121
  global connected_clients
122
- if connected_clients > 100:
123
- return False # 接続を拒否
124
  connected_clients += 1
125
 
126
  @socketio.on('disconnect')
127
  def handle_disconnect():
 
 
128
  global connected_clients
129
  connected_clients -= 1
130
  # キャンセル処理:接続が切断された場合、そのクライアントに関連するタスクをキャンセル。ただし、1番目で処理中のタスクはキャンセルしない
@@ -146,6 +148,7 @@ def submit_task():
146
 
147
  # クライアントIPアドレスを取得
148
  client_ip = get_remote_address()
 
149
 
150
  # 同一IPからの同時タスク数を制限
151
  if tasks_per_client.get(client_ip, 0) >= 2:
@@ -171,6 +174,8 @@ def submit_task():
171
 
172
  # 同一IPからのタスク数をインクリメント
173
  tasks_per_client[client_ip] = tasks_per_client.get(client_ip, 0) + 1
 
 
174
 
175
  queue_size = task_queue.qsize()
176
  return jsonify({'task_id': task_id, 'queue_size': queue_size})
@@ -192,7 +197,7 @@ def cancel_task(task_id):
192
  del active_tasks[task_id]
193
  # タスク数をデクリメント
194
  tasks_per_client[client_ip] = tasks_per_client.get(client_ip, 0) - 1
195
- update_queue_status('Task cancelled', client_ip)
196
  return jsonify({'message': 'Task cancellation requested'})
197
  else:
198
  for task in list(task_queue.queue):
 
1
  from flask import Flask, request, render_template, send_file, jsonify, send_from_directory
2
+ from flask_socketio import SocketIO, join_room, leave_room, close_room, rooms, disconnect
3
  from flask_cors import CORS
4
  from flask_limiter import Limiter
5
  from flask_limiter.util import get_remote_address
 
54
  self.is_processing = False
55
 
56
  # キューの状態を通知
57
+ def update_queue_status(message):
58
+ socketio.emit('queue_update', {'active_tasks': len(active_tasks), 'message': message})
59
 
60
  def process_task(task):
61
  try:
62
+ client_id = request.sid
63
  task.is_processing = True
64
  # ファイルデータをPIL Imageに変換
65
  image = Image.open(io.BytesIO(task.file_data))
 
80
  'task_id': task.task_id,
81
  'sotai_image': sotai_image,
82
  'sketch_image': sketch_image
83
+ }, to=client_id)
84
  except Exception as e:
85
  if not task.cancel_flag:
86
+ socketio.emit('task_error', {'task_id': task.task_id, 'error': str(e)}, to=client_id)
87
  finally:
88
  task.is_processing = False
89
  if task.task_id in active_tasks:
 
116
  # グローバル変数を使用して接続数とタスク数を管理
117
  connected_clients = 0
118
  tasks_per_client = {}
 
119
  @socketio.on('connect')
120
  def handle_connect(auth):
121
+ client_id = request.sid # クライアントIDを取得
122
+ join_room(client_id) # クライアントを自身のルームに入れる
123
  global connected_clients
 
 
124
  connected_clients += 1
125
 
126
  @socketio.on('disconnect')
127
  def handle_disconnect():
128
+ client_id = request.sid # クライアントIDを取得
129
+ leave_room(client_id) # クライアントをルームから出す
130
  global connected_clients
131
  connected_clients -= 1
132
  # キャンセル処理:接続が切断された場合、そのクライアントに関連するタスクをキャンセル。ただし、1番目で処理中のタスクはキャンセルしない
 
148
 
149
  # クライアントIPアドレスを取得
150
  client_ip = get_remote_address()
151
+ client_id = request.sid # クライアントIDを取得
152
 
153
  # 同一IPからの同時タスク数を制限
154
  if tasks_per_client.get(client_ip, 0) >= 2:
 
174
 
175
  # 同一IPからのタスク数をインクリメント
176
  tasks_per_client[client_ip] = tasks_per_client.get(client_ip, 0) + 1
177
+
178
+ update_queue_status('Task submitted')
179
 
180
  queue_size = task_queue.qsize()
181
  return jsonify({'task_id': task_id, 'queue_size': queue_size})
 
197
  del active_tasks[task_id]
198
  # タスク数をデクリメント
199
  tasks_per_client[client_ip] = tasks_per_client.get(client_ip, 0) - 1
200
+ update_queue_status('Task cancelled')
201
  return jsonify({'message': 'Task cancellation requested'})
202
  else:
203
  for task in list(task_queue.queue):