docs: def when_all_players_ready(self):
          """Initializes decisions based on ``player.initial_decision()``.
          If :attr:`num_subperiods` is set, starts a timed task to run the
          sub-periods.
          """
          self.group_decisions = {}
          self.subperiod_group_decisions = {}
          for player in self.get_players():
              self.group_decisions[player.participant.code] = player.initial_decision()
              self.subperiod_group_decisions[player.participant.code] = player.initial_decision()
          if self.num_subperiods():
              emitter = DiscreteEventEmitter(
                  self.period_length() / self.num_subperiods(), 
                  self.period_length(),
                  self,
                  self._subperiod_tick)
              emitter.start()
          elif self.rate_limit():
              def _tick(current_interval, intervals):
                  self.refresh_from_db()
                  if self._group_decisions_updated:
                      self.send('group_decisions', self.group_decisions)
                      self._group_decisions_updated = False
                      self.save(update_fields=['_group_decisions_updated'])
  
              update_period = self.rate_limit()
              emitter = DiscreteEventEmitter(
                  update_period, 
                  self.period_length(),
                  self,
                  _tick)
              emitter.start()
          self.save()