Browse Source

fix: unhandled task messages when session close in threadbased session

wangweimin 5 years ago
parent
commit
4d948cf5d3
2 changed files with 17 additions and 1 deletions
  1. 3 1
      pywebio/session/threadbased.py
  2. 14 0
      pywebio/utils.py

+ 3 - 1
pywebio/session/threadbased.py

@@ -154,8 +154,10 @@ class ThreadBasedSession(AbstractSession):
     def _cleanup(self):
         self.task_mqs = {}
 
+        self.unhandled_task_msgs.wait_empty(8)
         if not self.unhandled_task_msgs.empty():
-            raise RuntimeError('There are unhandled task msgs when session close!')
+            logger.debug("Unhandled task messages when session close:%s", self.unhandled_task_msgs.get())
+            raise RuntimeError('There are unhandled task messages when session close!')
 
         for t in self.threads:
             del ThreadBasedSession.thread2session[id(t)]

+ 14 - 0
pywebio/utils.py

@@ -21,6 +21,7 @@ class LimitedSizeQueue(queue.Queue):
     `get()` 返回全部数据
     队列满时,再 `put()` 会阻塞
     """
+
     def get(self):
         """获取队列全部数据"""
         try:
@@ -28,6 +29,19 @@ class LimitedSizeQueue(queue.Queue):
         except queue.Empty:
             return []
 
+    def wait_empty(self, timeout=None):
+        """等待队列内的数据被取走"""
+        with self.not_full:
+            if self._qsize() == 0:
+                return
+
+            if timeout is None:
+                self.not_full.wait()
+            elif timeout < 0:
+                raise ValueError("'timeout' must be a non-negative number")
+            else:
+                self.not_full.wait(timeout)
+
     def _init(self, maxsize):
         self.queue = []