Why is there a need to have two different Future classes in the
standard library (in asyncio and in concurrent)?
While these classes looks similar, they are using for two different paradigms of concurrent programming and have different implementations and interfaces. For example,
concurrent.futures.Future
used for thread/process based concurrent programming and shouldn't know nothing about event loop because there isn't one in this case. It's result
method just blocks thread's/process's execution flow till timeout or future is done.
asyncio.Future
used for coroutines based concurrent programming and should know about event loop, coroutine-functions and other related stuff. It's result
method wouldn't block execution flow since execution flow shouldn't be block at all in this case. Instead you should await future till it's done allowing execution flow to be returned and managed by event loop.
There are no benefits in mixing them, while splitting classes makes theirs implementations easier and interfaces clearer.