@@ -158,8 +158,11 @@ async def new_challenge(self, new_challenge: harvester_protocol.NewChallenge):
158158 raise ValueError (
159159 f"Invalid challenge size { challenge_size } , 32 was expected"
160160 )
161- all_responses = []
162- for filename , prover in self .provers .items ():
161+
162+ async def lookup_challenge (
163+ filename : Path , prover : DiskProver
164+ ) -> List [harvester_protocol .ChallengeResponse ]:
165+ all_responses : List [harvester_protocol .ChallengeResponse ] = []
163166 try :
164167 quality_strings = prover .get_qualities_for_challenge (
165168 new_challenge .challenge_hash
@@ -187,12 +190,21 @@ async def new_challenge(self, new_challenge: harvester_protocol.NewChallenge):
187190 new_challenge .challenge_hash , quality_str , prover .get_size ()
188191 )
189192 all_responses .append (response )
190- for response in all_responses :
191- yield OutboundMessage (
192- NodeType .FARMER ,
193- Message ("challenge_response" , response ),
194- Delivery .RESPOND ,
195- )
193+ return all_responses
194+
195+ awaitables = [
196+ lookup_challenge (filename , prover )
197+ for filename , prover in self .provers .items ()
198+ ]
199+
200+ # Concurrently executes all lookups on disk, to take advantage of multiple disk parallelism
201+ for sublist_awaitable in asyncio .as_completed (awaitables ):
202+ for response in await sublist_awaitable :
203+ yield OutboundMessage (
204+ NodeType .FARMER ,
205+ Message ("challenge_response" , response ),
206+ Delivery .RESPOND ,
207+ )
196208
197209 @api_request
198210 async def request_proof_of_space (
0 commit comments