benchmarking requests to localhost
Performance notwithstanding, there's some other cleanup that's worth doing:

Capitalize NUM_WORKERS since it's a global constant
Do not shadow your global output with a local variable of the same name; and ideally don't have a global output at all
After your get() and before your call to .text, you need to check whether the request succeeded - either via .ok and a log entry showing the reason; or by .raise_for_status()
never try / except / pass. This is the broadest and most dangerous form of silent exception-swallowing. If runner is executing and the user attempts to terminate the application with a Ctrl+C, that will be ignored here, and all other error information has become invisible to you. Consider at least except Exception: and logging the exception using the standard logging framework.
Consider annotating runner as def runner(number_of_requests: int) -&gt; str
Do not cast the result of .text to a string - it's already a string
Do not use time.time() here; instead use time.perf_counter() for a sufficiently short duration or time.monotonic() otherwise
The parens in (number_of_request*num_workers)/duration are redundant