From 708d48dcc7bbd3972ca3efe6e0d44ae205c3d0e6 Mon Sep 17 00:00:00 2001 From: UpstreamData Date: Mon, 12 Jun 2023 10:14:20 -0600 Subject: [PATCH] bug: fix caching, and update references to `MinerFactory()` to `miner_factory` --- pyasic/miners/miner_factory.py | 15 +++++++++++---- pyasic/network/__init__.py | 6 +++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/pyasic/miners/miner_factory.py b/pyasic/miners/miner_factory.py index 4b20e639..80772e4f 100644 --- a/pyasic/miners/miner_factory.py +++ b/pyasic/miners/miner_factory.py @@ -365,9 +365,15 @@ class MinerFactory: self.cache = {} async def get_multiple_miners(self, ips: List[str], limit: int = 200): - tasks = [] results = [] + async for miner in self.get_miner_generator(ips, limit): + results.append(miner) + + return results + + async def get_miner_generator(self, ips: list, limit: int = 200): + tasks = [] semaphore = asyncio.Semaphore(limit) for ip in ips: @@ -378,13 +384,14 @@ class MinerFactory: try: result = await task if result is not None: - results.append(result) + yield result finally: semaphore.release() - return results - async def get_miner(self, ip: str): + ip = str(ip) + if ip in self.cache: + return self.cache[ip] miner_type = None for _ in range(RETRIES): task = asyncio.create_task(self._get_miner_type(ip)) diff --git a/pyasic/network/__init__.py b/pyasic/network/__init__.py index 34fe2b06..d2cc781a 100644 --- a/pyasic/network/__init__.py +++ b/pyasic/network/__init__.py @@ -19,7 +19,7 @@ import ipaddress import logging from typing import AsyncIterator, List, Union -from pyasic.miners.miner_factory import AnyMiner, MinerFactory +from pyasic.miners.miner_factory import AnyMiner, miner_factory from pyasic.network.net_range import MinerNetworkRange from pyasic.settings import PyasicSettings @@ -106,7 +106,7 @@ class MinerNetwork: logging.debug(f"{self} - (Scan Network For Miners) - Scanning") # clear cached miners - MinerFactory().clear_cached_miners() + miner_factory.clear_cached_miners() limit = asyncio.Semaphore(PyasicSettings().network_scan_threads) miners = await asyncio.gather( @@ -232,7 +232,7 @@ async def ping_and_get_miner( # make sure the writer is closed await writer.wait_closed() # ping was successful - return await MinerFactory().get_miner(ip) + return await miner_factory.get_miner(ip) except asyncio.exceptions.TimeoutError: # ping failed if we time out continue