5
5
from .task_queue import TaskQueue
6
6
import threading
7
7
from ..logging_config import setup_logger
8
+ import concurrent .futures
8
9
9
10
class LocalTaskQueue (TaskQueue ):
10
11
def __init__ (self ):
11
12
self .logger = setup_logger ("agentserve.queue.local" )
12
13
self .results = {}
13
14
self .statuses = {}
14
- self .loop = asyncio .new_event_loop ()
15
+ max_workers = 10 # default
16
+ if config :
17
+ max_workers = config .get ('queue' , {}).get ('max_workers' , 10 )
18
+ self .thread_pool = concurrent .futures .ThreadPoolExecutor (max_workers = max_workers )
19
+ self .lock = threading .Lock ()
15
20
self .logger .info ("LocalTaskQueue initialized" )
16
21
17
22
def enqueue (self , agent_function , task_data : Dict [str , Any ], task_id : str ):
18
23
self .logger .debug (f"Enqueueing task { task_id } " )
19
- self .statuses [task_id ] = 'queued'
20
- threading .Thread (target = self ._run_task , args = (agent_function , task_data , task_id )).start ()
24
+ with self .lock :
25
+ self .statuses [task_id ] = 'queued'
26
+ self .thread_pool .submit (self ._run_task , agent_function , task_data , task_id )
21
27
22
28
def _run_task (self , agent_function , task_data : Dict [str , Any ], task_id : str ):
23
29
self .logger .debug (f"Starting task { task_id } " )
24
- self .statuses [task_id ] = 'in_progress'
30
+ with self .lock :
31
+ self .statuses [task_id ] = 'in_progress'
32
+
25
33
try :
26
34
if getattr (agent_function , '_is_async' , False ):
27
- asyncio .set_event_loop (self .loop )
28
- result = self .loop .run_until_complete (agent_function (task_data ))
35
+ loop = asyncio .new_event_loop ()
36
+ asyncio .set_event_loop (loop )
37
+ try :
38
+ result = loop .run_until_complete (agent_function (task_data ))
39
+ finally :
40
+ loop .close ()
29
41
else :
30
42
result = agent_function (task_data )
31
- self .results [task_id ] = result
32
- self .statuses [task_id ] = 'completed'
43
+
44
+ with self .lock :
45
+ self .results [task_id ] = result
46
+ self .statuses [task_id ] = 'completed'
33
47
self .logger .info (f"Task { task_id } completed successfully" )
48
+
34
49
except Exception as e :
35
50
self .logger .error (f"Task { task_id } failed: { str (e )} " )
36
- self .results [task_id ] = e
37
- self .statuses [task_id ] = 'failed'
51
+ with self .lock :
52
+ self .results [task_id ] = e
53
+ self .statuses [task_id ] = 'failed'
38
54
39
55
def get_status (self , task_id : str ) -> str :
40
- return self .statuses .get (task_id , 'not_found' )
56
+ with self .lock :
57
+ return self .statuses .get (task_id , 'not_found' )
41
58
42
59
def get_result (self , task_id : str ) -> Any :
43
- if task_id not in self .results :
44
- return None
45
- result = self .results [task_id ]
46
- if isinstance (result , Exception ):
47
- raise result
48
- return result
60
+ with self .lock :
61
+ if task_id not in self .results :
62
+ return None
63
+ result = self .results [task_id ]
64
+ if isinstance (result , Exception ):
65
+ raise result
66
+ return result
0 commit comments