class BlockingDeque(deque): def __init__(self, *args, **kwargs): super(BlockingDeque, self).__init__(*args, **kwargs) self.sema = Semaphore(len(self)) def append(self, *args, **kwargs): ret = super(BlockingDeque, self).append(*args, **kwargs) self.sema.release() return ret def appendleft(self, *args, **kwargs): ret = super(BlockingDeque, self).appendleft(*args, **kwargs) self.sema.release() return ret def clear(self, *args, **kwargs): ret = super(BlockingDeque, self).clear(*args, **kwargs) while not self.sema.locked(): self.sema.acquire(blocking=False) return ret def extend(self, *args, **kwargs): pre_n = len(self) ret = super(BlockingDeque, self).extend(*args, **kwargs) post_n = len(self) for i in xrange(pre_n, post_n): self.sema.release() return ret def extendleft(self, *args, **kwargs): pre_n = len(self) ret = super(BlockingDeque, self).extendleft(*args, **kwargs) post_n = len(self) for i in xrange(pre_n, post_n): self.sema.release() return ret def pop(self, *args, **kwargs): self.sema.acquire() return super(BlockingDeque, self).pop(*args, **kwargs) def popleft(self, *args, **kwargs): self.sema.acquire() return super(BlockingDeque, self).popleft(*args, **kwargs) def remove(self, *args, **kwargs): ret = super(BlockingDeque, self).remove(*args, **kwargs) self.sema.acquire() return ret
class OCCurveManager(object): def __init__(self, oc_gateway): self._oc_gateway = oc_gateway self._model_settings_update_in_progress = Semaphore() self._vol_curves = {} self._parent_symbol_to_sandbox_symbol_dict = {} self._parent_month_id_to_sandbox_month_id_dict = {} self._vol_curve_factory = VolCurveFactory(oc_gateway) ####################### # model settings request handling def get_model_settings(self, month_id): vol_curve = self._vol_curves.get(month_id) if not vol_curve: vol_curve = self._vol_curve_factory.get_vol_curve(month_id) self._vol_curves[month_id] = vol_curve return vol_curve.get_curve_settings() ####################### # synchronization handlers def on_model_update_notification(self): if not self._model_settings_update_in_progress.locked(): for month_id, vol_curve in self._vol_curves.iteritems(): vol_curve.refresh_oc_model_settings() ####################### # model input manipulation utils def set_model_settings(self, **kwargs): with self._model_settings_update_in_progress: month_id = kwargs["month_id"] vol_curve = self._vol_curves[month_id] new_settings = vol_curve.set_model_settings(**kwargs) return new_settings def move_model_inputs_by_price(self, **kwargs): with self._model_settings_update_in_progress: month_id = kwargs["month_id"] vol_curve = self._vol_curves[month_id] new_settings = vol_curve.move_inputs_by_price(**kwargs) return new_settings