From 3e5da64571c8d6ebf71f63f5c81cf821ed3dea03 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Wed, 22 Mar 2023 13:23:23 -0400 Subject: [PATCH] Cache contract lookups from `Client.get_con()` --- piker/brokers/ib/api.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/piker/brokers/ib/api.py b/piker/brokers/ib/api.py index 62c0adeb..7eac4bcc 100644 --- a/piker/brokers/ib/api.py +++ b/piker/brokers/ib/api.py @@ -24,7 +24,10 @@ from contextlib import asynccontextmanager as acm from contextlib import AsyncExitStack from dataclasses import asdict, astuple from datetime import datetime -from functools import partial +from functools import ( + partial, + lru_cache, +) import itertools from math import isnan from typing import ( @@ -328,7 +331,7 @@ class Client: self.ib.RaiseRequestErrors = True # contract cache - self._feeds: dict[str, trio.abc.SendChannel] = {} + self._cons: dict[str, Contract] = {} # NOTE: the ib.client here is "throttled" to 45 rps by default @@ -612,13 +615,20 @@ class Client: return con + # TODO: make this work with our `MethodProxy`.. + # @lru_cache(maxsize=None) async def get_con( self, conid: int, ) -> Contract: - return await self.ib.qualifyContractsAsync( - ibis.Contract(conId=conid) - ) + try: + return self._cons[conid] + except KeyError: + con: Contract = await self.ib.qualifyContractsAsync( + ibis.Contract(conId=conid) + ) + self._cons[conid] = con + return con def parse_patt2fqsn( self,