pbordescnil commited on
Commit
fd71ccc
·
1 Parent(s): 8fe2216

Allow concurrent search jobs

Browse files
application_neo4j/README.md CHANGED
@@ -130,3 +130,18 @@ Lors de son lancement, le Space charge un export de la base de données neo4j de
130
 
131
  Puisque le dataset est privé sur Hugging Face, le Space utilise un secret `HF_TOKEN` qui donne accès en lecture au dataset.
132
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
 
131
  Puisque le dataset est privé sur Hugging Face, le Space utilise un secret `HF_TOKEN` qui donne accès en lecture au dataset.
132
 
133
+ ### Recherches simultanées
134
+
135
+ L'application accepte par défaut deux recherches simultanées. Chaque recherche
136
+ conserve son propre identifiant, son état de progression et son résultat. Les
137
+ requêtes supplémentaires restent dans l'état `queued` jusqu'à ce qu'un worker
138
+ soit disponible.
139
+
140
+ Le nombre de recherches simultanées peut être configuré avec la variable
141
+ d'environnement `SEARCH_MAX_WORKERS`. La valeur doit être un entier strictement
142
+ positif ; une valeur absente ou invalide utilise la valeur par défaut `2`.
143
+
144
+ La création initiale des projections GDS reste sérialisée afin que deux
145
+ requêtes arrivant au démarrage ne tentent pas de créer le même graphe. Une fois
146
+ les projections disponibles, les BFS et la construction de leurs résultats
147
+ s'exécutent indépendamment.
application_neo4j/app.py CHANGED
@@ -24,10 +24,29 @@ NEO4J_URI = "bolt://localhost:7687"
24
  GDS_GRAPH_NAME = "genealogie_gds"
25
  SEARCH_JOB_TTL_SECONDS = 60 * 60
26
  RESULT_BATCH_SIZE = 25
 
27
 
28
- # A single worker prevents CPU-heavy GDS searches from competing on the
29
- # cpu-basic Space. Additional requests remain visible with the "queued" stage.
30
- search_executor = ThreadPoolExecutor(max_workers=1, thread_name_prefix="search")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  search_jobs = {}
32
  search_jobs_lock = Lock()
33
  graph_projection_lock = Lock()
 
24
  GDS_GRAPH_NAME = "genealogie_gds"
25
  SEARCH_JOB_TTL_SECONDS = 60 * 60
26
  RESULT_BATCH_SIZE = 25
27
+ DEFAULT_SEARCH_MAX_WORKERS = 2
28
 
29
+
30
+ def positive_int_env(name, default):
31
+ """Read a strictly positive integer setting, falling back safely."""
32
+ try:
33
+ value = int(os.environ.get(name, default))
34
+ except (TypeError, ValueError):
35
+ return default
36
+ return value if value > 0 else default
37
+
38
+
39
+ # Neo4j's driver and the projected GDS graphs support concurrent read jobs.
40
+ # Keep the pool bounded because every BFS is CPU- and memory-intensive. Jobs
41
+ # beyond this limit remain visible in the existing "queued" stage.
42
+ SEARCH_MAX_WORKERS = positive_int_env(
43
+ "SEARCH_MAX_WORKERS",
44
+ DEFAULT_SEARCH_MAX_WORKERS,
45
+ )
46
+ search_executor = ThreadPoolExecutor(
47
+ max_workers=SEARCH_MAX_WORKERS,
48
+ thread_name_prefix="search",
49
+ )
50
  search_jobs = {}
51
  search_jobs_lock = Lock()
52
  graph_projection_lock = Lock()