text: """
  Make events hooks non-blocking using async or @concurrent
  """
  import asyncio
  import time
  
  from mitmproxy.script import concurrent
  from mitmproxy import ctx
  
  
  # Hooks can be async, which allows the hook to call async functions and perform async I/O
  # without blocking other requests. This is generally preferred for new addons.
  async def request(flow):
      ctx.log.info(f"handle request: {flow.request.host}{flow.request.path}")
      await asyncio.sleep(5)
      ctx.log.info(f"start  request: {flow.request.host}{flow.request.path}")
  
  
  # Another option is to use @concurrent, which launches the hook in its own thread.
  # Please note that this generally opens the door to race conditions and decreases performance if not required.
  # Rename the function below to request(flow) to try it out.
  @concurrent  # Remove this to make it synchronous and see what happens
  def request_concurrent(flow):
      # This is ugly in mitmproxy's UI, but you don't want to use mitmproxy.ctx.log from a different thread.
      print(f"handle request: {flow.request.host}{flow.request.path}")
      time.sleep(5)
      print(f"start  request: {flow.request.host}{flow.request.path}")
  