I'm using asyncio to run a piece of blocking code like this:
result = await loop.run_in_executor(None, long_running_function)
My question is: Can I impose a timeout for the execution of long_running_function
?
Basically I don't want long_running_function
to last more than 2 seconds and I can't do proper timeout handling within it because that function comes from a third-party library.
A warning about cancelling long running functions:
Although wrapping the Future
returned by loop.run_in_executor
with an asyncio.wait_for
call will allow the event loop to stop waiting for long_running_function
after some x
seconds, it won't necessarily stop the underlying long_running_function
. This is one of the shortcomings of concurrent.futures
and to the best of my knowledge there is no simple way to just cancel a concurrent.futures.Future
.
You could use asyncio.wait_for:
future = loop.run_in_executor(None, long_running_function)
result = await asyncio.wait_for(future, timeout, loop=loop)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With