class_docstr: A semaphore that prevents release() being called too many times.
  
  If `.release` would increment the semaphore's value past the initial
  value, it raises `ValueError`. Semaphores are mostly used to guard
  resources with limited capacity, so a semaphore released too many times
  is a sign of a bug.
class_docstr_tok: ["A","semaphore","that","prevents","release","(",")","being","called","too","many","times",".","If","`",".release","`","would","increment","the","semaphore","'s","value","past","the","initial","value",",","it","raises","`","ValueError","`",".","Semaphores","are","mostly","used","to","guard","resources","with","limited","capacity",",","so","a","semaphore","released","too","many","times","is","a","sign","of","a","bug","."]
docstr: Increment the counter and wake one waiter.
docstr_tok: ["Increment","the","counter","and","wake","one","waiter","."]
code: def release(self) -> None:
      """Increment the counter and wake one waiter."""
      if self._value >= self._initial_value:
          raise ValueError("Semaphore released too many times")
      super().release()
  
imports: import collections
  import datetime
  import types
  from tornado import gen, ioloop
  from tornado.concurrent import Future, future_set_result_unless_cancelled
  from typing import Union, Optional, Type, Any, Awaitable
  import typing
label_desc: Use image node_id 2 for calling the BoundedSemaphore obj's underlying member method code with example usage: obj.release() without return types