-
-
Notifications
You must be signed in to change notification settings - Fork 178
stream writer.close() is not awaitable #466
Comments
It would be hugely backward compatible. It would also be a huge bug magnet
-- diagnostics if you forget to await the close() call are minimal.
|
@gvanrossum sorry, was it about option [1] or [2]? |
I believe @gvanrossum wrote about returning a future from Right now I'm making every |
That was about making close() a coroutine.
|
But what is the failure mode if you don't use wait_closed()? The stream |
The same is true if user doesn't call |
Otherwise we should suggest |
Yes. It's not deterministic: you don't now if it's just one trip through the loop or more. It's generally a pain to close streams in unittests and asyncio programs that wan't to cleanup. It's really painful to add ugly workarounds like I'm with Andrew for fixing this, I wanted to propose this myself since long time ago. |
OK, but unittests are different from regular apps. They can await Also, if close() became a coroutine, calling it without waiting for it |
No, I don't propose converting It's anti-pattern maybe. Unfortunately the ship has sailed but we still could return a future from |
Please, no. There are many close() methods and it would be confusing which
return a Future and which don't.
|
I agree with Guido, if we want to fix this let's add a distinct new method. The ship for re-designing "close()" has sailed. |
For the record here, I would like to mention, that it's only 1 loop trip for simple TCP transport, which is definitely not the case with SSL. I bumped into the issue on the week (in aiokafka development), as there is no safe way to wait for SSL to close if used in streams. |
The problem is:
writer.close()
is a regular method which callstransport.close()
.But
transport.close()
actually closes the connection only on next loop iteration byself._loop.call_soon(self._call_connection_lost, None)
call`.Now a safe way for stream closing is
but it looks ugly.
I see two possible solutions:
writer.wait_closed()
coroutine.writer.close()
signature to return a future object. The future will be resumed on protocol'sconnection_lost()
callback.Honestly I vote on point 2: it looks more native and fully backward compatible with existing code.
The text was updated successfully, but these errors were encountered: