Spaces:
Running
Running
Commit ·
fd71ccc
1
Parent(s): 8fe2216
Allow concurrent search jobs
Browse files- application_neo4j/README.md +15 -0
- application_neo4j/app.py +22 -3
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 |
-
|
| 29 |
-
|
| 30 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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()
|