@@ -66,28 +66,42 @@ async def _execute(self, state: dict) -> dict:
6666 pose_dir = Path (__file__ ).parent .parent / "data" / "docked_poses" / session_id
6767 pose_dir .mkdir (parents = True , exist_ok = True )
6868
69+ semaphore = asyncio .Semaphore (4 )
6970 results = []
70- for idx , mol in enumerate (molecules [:30 ], start = 1 ):
71- if state .get ("cancelled" ): break # Check local flag too
72-
73- smiles = mol .get ("smiles" )
74- if not smiles : continue
75-
76- energy , pose_meta = await _dock_one_async (
77- smiles , pocket , receptor_pdbqt , exe , mode , log ,
78- pose_dir = pose_dir , pose_id = _pose_id (smiles , idx )
79- )
80-
81- if energy is not None :
82- results .append ({
83- "smiles" : smiles ,
84- "compound_name" : f"Lead-{ len (results )+ 1 } " ,
85- "binding_energy" : energy ,
86- "cnn_score" : pose_meta .get ("cnn_score" ) if pose_meta else None ,
87- "cnn_affinity" : pose_meta .get ("cnn_affinity" ) if pose_meta else None ,
88- "method" : mode ,
89- "pose_id" : pose_meta .get ("pose_id" ) if pose_meta else None
90- })
71+
72+ async def docked_task (idx , mol_data ):
73+ async with semaphore :
74+ smiles = mol_data .get ("smiles" )
75+ if not smiles : return None
76+
77+ energy , pose_meta = await _dock_one_async (
78+ smiles , pocket , receptor_pdbqt , exe , mode , log ,
79+ pose_dir = pose_dir , pose_id = _pose_id (smiles , idx )
80+ )
81+
82+ # Update progress for EACH completion
83+ current_prog = 30 + int ((len (results ) / len (molecules )) * 60 )
84+ if hasattr (self , 'update_progress' ):
85+ await self .update_progress (current_prog , f"Docking { len (results )+ 1 } /{ len (molecules )} ..." )
86+
87+ if energy is not None :
88+ return {
89+ "smiles" : smiles ,
90+ "compound_name" : f"Lead-{ idx + 1 } " ,
91+ "binding_energy" : energy ,
92+ "cnn_score" : pose_meta .get ("cnn_score" ) if pose_meta else None ,
93+ "cnn_affinity" : pose_meta .get ("cnn_affinity" ) if pose_meta else None ,
94+ "method" : mode ,
95+ "pose_id" : pose_meta .get ("pose_id" ) if pose_meta else None
96+ }
97+ return None
98+
99+ # Execute all tasks
100+ tasks = [docked_task (i , m ) for i , m in enumerate (molecules )]
101+ docking_results_all = await asyncio .gather (* tasks )
102+
103+ # Filter out failed ones
104+ results = [r for r in docking_results_all if r is not None ]
91105
92106 return {"docking_results" : sorted (results , key = lambda x : x ["binding_energy" ])}
93107
0 commit comments