code: def create_spot_instances(ec2, price, image_id, spec, num_instances=1, timeout=None, tentative=False, tags=None):
      
      def spotRequestNotFound(e):
          return e.error_code == "InvalidSpotInstanceRequestID.NotFound"
  
      for attempt in retry_ec2(retry_for=a_long_time,
                               retry_while=inconsistencies_detected):
          with attempt:
              requests = ec2.request_spot_instances(
                  price, image_id, count=num_instances, **spec)
  
      if tags is not None:
          for requestID in (request.id for request in requests):
              for attempt in retry_ec2(retry_while=spotRequestNotFound):
                  with attempt:
                      ec2.create_tags([requestID], tags)
  
      num_active, num_other = 0, 0
      # noinspection PyUnboundLocalVariable,PyTypeChecker
      # request_spot_instances's type annotation is wrong
      for batch in wait_spot_requests_active(ec2,
                                             requests,
                                             timeout=timeout,
                                             tentative=tentative):
          instance_ids = []
          for request in batch:
              if request.state == 'active':
                  instance_ids.append(request.instance_id)
                  num_active += 1
              else:
                  log.info(
                      'Request %s in unexpected state %s.',
                      request.id,
                      request.state)
                  num_other += 1
          if instance_ids:
              # This next line is the reason we batch. It's so we can get multiple instances in
              # a single request.
              yield ec2.get_only_instances(instance_ids)
      if not num_active:
          message = 'None of the spot requests entered the active state'
          if tentative:
              log.warn(message + '.')
          else:
              raise RuntimeError(message)
      if num_other:
          log.warn('%i request(s) entered a state other than active.', num_other)
docs: :rtype: Iterator[list[Instance]]