Browse Source

fix: threadbased session can't exit because of callback thread

wangweimin 5 years ago
parent
commit
dcb38d460d
1 changed files with 7 additions and 4 deletions
  1. 7 4
      pywebio/session/threadbased.py

+ 7 - 4
pywebio/session/threadbased.py

@@ -206,7 +206,8 @@ class ThreadBasedSession(AbstractSession):
         self.callback_mq = queue.Queue(maxsize=self.callback_mq_maxsize)
         self.callback_thread = threading.Thread(target=self._dispatch_callback_event,
                                                 daemon=True, name='callback-' + random_str(10))
-        self.register_thread(self.callback_thread)
+        # self.register_thread(self.callback_thread)
+        self.thread2session[id(self.callback_thread)] = self  # 用于在线程内获取会话
         self.callback_thread.start()
         logger.debug('Callback thread start')
 
@@ -214,7 +215,9 @@ class ThreadBasedSession(AbstractSession):
         while not self.closed():
             event = self.callback_mq.get()
             if event is None:  # 结束信号
+                logger.debug('Callback thread exit')
                 break
+
             callback_info = self.callbacks.get(event['task_id'])
             if not callback_info:
                 logger.error("No callback for callback_id:%s", event['task_id'])
@@ -260,9 +263,9 @@ class ThreadBasedSession(AbstractSession):
 
         :param threading.Thread thread: 线程对象
         """
-        self.threads.append(t)
-        self.thread2session[id(t)] = self
-        event_mq = queue.Queue(maxsize=self.event_mq_maxsize)
+        self.threads.append(t)  # 保存 registered thread,用于主任务线程退出后等待注册线程结束
+        self.thread2session[id(t)] = self  # 用于在线程内获取会话
+        event_mq = queue.Queue(maxsize=self.event_mq_maxsize)  # 线程内的用户事件队列
         self.task_mqs[self._get_task_id(t)] = event_mq