Skip to content

Commit efc3113

Browse files
authored
Ms.parallel harvester (#194)
* Harvester fetches qualities in parallel and returns qualities asynchronously to improve efficiency
1 parent 958b90d commit efc3113

File tree

1 file changed

+20
-8
lines changed

1 file changed

+20
-8
lines changed

src/harvester.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)