-
Notifications
You must be signed in to change notification settings - Fork 5.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
websocket: Async version of WebSocketHandler.close is needed #2914
Comments
@garenchan sorry to bother—not sure if you have any thoughts on this. thanks. |
Also having this problem. Do you know where might a safe (and close-to-the-source) place be to catch this with a try/except block until this is fixed? |
Also running into this after upgrading from python 3.7.6 to 3.8.6 |
Thanks. I solved this problem by downgrading python to 3.6 |
you can avoid this by using an Here I created an import functools
import asyncio
import tornado.websocket
import tornado.httpserver
import tornado.ioloop
import tornado.web
class Handler(tornado.websocket.WebSocketHandler):
def initialize(self, *, handlers):
self._handlers = handlers
self._closed = asyncio.Event()
def open(self):
self._handlers.add(self)
def on_message(self, message):
pass
def on_close(self):
self._handlers.remove(self)
self._closed.set()
def check_origin(self, origin):
return True
async def aclose(self):
self.close()
await self._closed.wait()
return self.close_code, self.close_reason
async def my_function():
handlers = set()
application = tornado.web.Application(
[
(r"/", Handler, {"handlers": handlers}),
]
)
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8080)
try:
await asyncio.sleep(20.0)
finally:
http_server.stop()
await asyncio.gather(*(handler.aclose() for handler in handlers))
asyncio.run(my_function()) |
The root cause of this issue is that |
Per the warning in the asyncio documentation, we need to hold a strong reference to all asyncio Tasks to prevent premature GC. Following discussions in cpython (python/cpython#91887), we hold these references on the IOLoop instance to ensure that they are strongly held but do not cause leaks if the event loop itself is discarded. This is expected to fix all of the various "task was destroyed but it is pending" warnings that have been reported. The IOLoop._pending_tasks set is expected to become obsolete if corresponding changes are made to asyncio in Python 3.13. Fixes tornadoweb#3209 Fixes tornadoweb#3047 Fixes tornadoweb#2763 Some issues involve this warning as their most visible symptom, but have an underlying cause that should still be addressed. Updates tornadoweb#2914 Updates tornadoweb#2356
Per the warning in the asyncio documentation, we need to hold a strong reference to all asyncio Tasks to prevent premature GC. Following discussions in cpython (python/cpython#91887), we hold these references on the IOLoop instance to ensure that they are strongly held but do not cause leaks if the event loop itself is discarded. This is expected to fix all of the various "task was destroyed but it is pending" warnings that have been reported. The IOLoop._pending_tasks set is expected to become obsolete if corresponding changes are made to asyncio in Python 3.13. Fixes tornadoweb#3209 Fixes tornadoweb#3047 Fixes tornadoweb#2763 Some issues involve this warning as their most visible symptom, but have an underlying cause that should still be addressed. Updates tornadoweb#2914 Updates tornadoweb#2356 (cherry picked from commit bffed1a)
NOTE: this is different from #2763. possibly related to #2448, but also distinct.
After starting a websocket server, I am getting
even after appropriately closing all connections. this is different from #2763, where the unresolved task was
WebSocketProtocol13._receive_frame_loop
, and not all connections were closed.to reproduce this easily, run the following tiny python3 program:
in a separate Node.js console (for example), run:
the culprit appears to be the future
fut
here, which is never awaited:tornado/tornado/web.py
Lines 2323 to 2326 in 79b9c4f
tornado version:
tornado-6.0.4
. Python version:3.8.5
.i am unable to further diagnose the issue, or fix it. thanks for your attention and time.
The text was updated successfully, but these errors were encountered: