Browse Source

Script mode no need register thread

wangweimin 5 years ago
parent
commit
cfaa406318
3 changed files with 29 additions and 9 deletions
  1. 2 2
      pywebio/platform/tornado.py
  2. 2 2
      pywebio/session/__init__.py
  3. 25 5
      pywebio/session/threadbased.py

+ 2 - 2
pywebio/platform/tornado.py

@@ -9,7 +9,7 @@ import tornado.httpserver
 import tornado.ioloop
 import tornado.websocket
 from tornado.web import StaticFileHandler
-from ..session import CoroutineBasedSession, ThreadBasedSession, get_session_implement, DesignatedThreadSession, \
+from ..session import CoroutineBasedSession, ThreadBasedSession, get_session_implement, ScriptModeSession, \
     mark_server_started
 from ..utils import get_free_port, wait_host_port, STATIC_PATH
 
@@ -143,7 +143,7 @@ def start_server_in_current_thread_session():
 
         def open(self):
             if SingleSessionWSHandler.session is None:
-                SingleSessionWSHandler.session = DesignatedThreadSession(thread,
+                SingleSessionWSHandler.session = ScriptModeSession(thread,
                                                                          on_task_command=self.send_msg_to_client,
                                                                          loop=asyncio.get_event_loop())
                 websocket_conn_opened.set()

+ 2 - 2
pywebio/session/__init__.py

@@ -3,7 +3,7 @@ from functools import wraps
 
 from .base import AbstractSession
 from .coroutinebased import CoroutineBasedSession
-from .threadbased import ThreadBasedSession, DesignatedThreadSession
+from .threadbased import ThreadBasedSession, ScriptModeSession
 from ..exceptions import SessionNotFoundException
 
 THREAD_BASED = 'ThreadBased'
@@ -41,7 +41,7 @@ def get_session_implement():
 def _start_script_mode_server():
     global _session_type
     from ..platform import start_server_in_current_thread_session
-    _session_type = DesignatedThreadSession
+    _session_type = ScriptModeSession
     start_server_in_current_thread_session()
 
 

+ 25 - 5
pywebio/session/threadbased.py

@@ -239,18 +239,36 @@ class ThreadBasedSession(AbstractSession):
         self.event_mqs[tname] = event_mq
 
 
-class DesignatedThreadSession(ThreadBasedSession):
-    """以指定进程为会话"""
+class ScriptModeSession(ThreadBasedSession):
+    """Script mode的会话实现"""
+
+    @classmethod
+    def get_current_session(cls) -> "ScriptModeSession":
+        if cls.instance is None:
+            raise SessionNotFoundException("Can't find current session. It might be a bug.")
+        return cls.instance
+
+    @classmethod
+    def get_current_task_id(cls):
+        task_id = threading.current_thread().getName()
+        session = cls.get_current_session()
+        if task_id not in session.event_mqs:
+            session.register_thread(threading.current_thread(), as_daemon=False)
+        return task_id
+
+    instance = None
 
     def __init__(self, thread, on_task_command=None, loop=None):
         """
-        :param on_coro_msg: 由协程内发给session的消息的处理函数
         :param on_task_command: 会话结束的处理函数。后端Backend在相应on_session_close时关闭连接时,
             需要保证会话内的所有消息都传送到了客户端
         :param loop: 事件循环。若 on_task_command 或者on_session_close中有调用使用asyncio事件循环的调用,
             则需要事件循环实例来将回调在事件循环的线程中执行
-
         """
+        if ScriptModeSession.instance is not None:
+            raise RuntimeError("ScriptModeSession can only be created once.")
+        ScriptModeSession.instance = self
+
         self._on_task_command = on_task_command or (lambda _: None)
         self._on_session_close = lambda: None
         self._loop = loop
@@ -267,4 +285,6 @@ class DesignatedThreadSession(ThreadBasedSession):
         self.callback_thread = None
         self.callbacks = {}  # callback_id -> (callback_func, is_mutex)
 
-        self.register_thread(thread, as_daemon=False)
+        tname = thread.getName()
+        event_mq = queue.Queue(maxsize=self.event_mq_maxsize)
+        self.event_mqs[tname] = event_mq