Browse Source

add parrarel processing

blezz-tech 1 tháng trước cách đây
mục cha
commit
93dd08e30f
2 tập tin đã thay đổi với 25 bổ sung16 xóa
  1. 13 16
      handlers/handlers/open_access_request_pending.py
  2. 12 0
      handlers/lib.py

+ 13 - 16
handlers/handlers/open_access_request_pending.py

@@ -6,9 +6,10 @@ from EchoBot import JabberBot
 from slixmpp.stanza import Message
 import jsonAndRequest as jsreq
 from time import sleep
-from lib import filter_interval_tickets
+from lib import run_process
 from classes.Ticket import Ticket
 from typing import List
+from concurrent.futures import ThreadPoolExecutor
 
 botname = "open_access_request_pending"
 operating_status = 320
@@ -58,21 +59,17 @@ def start_handler():
     global tickets
     tickets = get_fake_data()
 
-    while(True):
-        # TODO: Придумать более надёжный механизм парарельной обработки тикетов
-        # А также более надёжный механизм удаления тикетов из массива
-        if tickets:
-            for ticket in tickets:
-                ticket.interval_attempts -= 1
-                if ticket.interval_attempts <= 0:
-                    interval_attempts_unlimited(ticket)
-                else:
-                    processing(ticket)
-            tickets = filter_interval_tickets(tickets)
-        
-        logging.debug(tickets)
-        logging.debug("Sleep")
-        sleep(INTERVAL_TIME)
+    with ThreadPoolExecutor() as executor:
+        while True:
+            # Параллельная обработка всех тикетов
+            processed = list(executor.map(run_process(interval_attempts_unlimited, processing), tickets))
+            
+            # Фильтрация тикетов
+            tickets = [t for t in processed if t is not None]
+            
+            logging.debug(tickets)
+            logging.debug("Sleep")
+            sleep(INTERVAL_TIME)
 
 
 # START CUSTOM FUNCTIONS

+ 12 - 0
handlers/lib.py

@@ -3,3 +3,15 @@ def filter_interval_tickets(tickets):
     """ Очистка тикетов, у которых закончились попытки """
     return list(filter(lambda ticket: ticket.interval_attempts > 0, tickets))
 
+def run_process(interval_attempts_unlimited, processing):
+    """Обработка одного тикета с удалением."""
+    def go(ticket):    
+        ticket.interval_count -= 1
+        if ticket.interval_count <= 0:
+            interval_attempts_unlimited(ticket)
+            return None  # Маркер для удаления
+        else:
+            processing(ticket)
+        return ticket
+
+    return go