Script mode的会话实现
| 306 | |
| 307 | |
| 308 | class ScriptModeSession(ThreadBasedSession): |
| 309 | """Script mode的会话实现""" |
| 310 | |
| 311 | @classmethod |
| 312 | def get_current_session(cls) -> "ScriptModeSession": |
| 313 | if cls.instance is None: |
| 314 | raise SessionNotFoundException("Can't find current session. It might be a bug.") |
| 315 | if cls.instance.closed(): |
| 316 | raise SessionClosedException() |
| 317 | return cls.instance |
| 318 | |
| 319 | @classmethod |
| 320 | def get_current_task_id(cls): |
| 321 | task_id = super().get_current_task_id() |
| 322 | session = cls.get_current_session() |
| 323 | if task_id not in session.task_mqs: |
| 324 | session.register_thread(threading.current_thread()) |
| 325 | return task_id |
| 326 | |
| 327 | instance = None |
| 328 | |
| 329 | def __init__(self, thread, session_info, on_task_command=None, loop=None): |
| 330 | """ |
| 331 | :param thread: 第一次调用PyWebIO交互函数的线程 todo 貌似本参数并不必要 |
| 332 | :param on_task_command: 会话结束的处理函数。后端Backend在相应on_session_close时关闭连接时, |
| 333 | 需要保证会话内的所有消息都传送到了客户端 |
| 334 | :param loop: 事件循环。若 on_task_command 或者on_session_close中有调用使用asyncio事件循环的调用, |
| 335 | 则需要事件循环实例来将回调在事件循环的线程中执行 |
| 336 | """ |
| 337 | if ScriptModeSession.instance is not None: |
| 338 | raise RuntimeError("ScriptModeSession can only be created once.") |
| 339 | ScriptModeSession.instance = self |
| 340 | |
| 341 | super().__init__(target=None, session_info=session_info, on_task_command=on_task_command, loop=loop) |
| 342 | |
| 343 | tid = id(thread) |
| 344 | event_mq = queue.Queue(maxsize=self.event_mq_maxsize) |
| 345 | self.task_mqs[tid] = event_mq |
no outgoing calls
no test coverage detected
searching dependent graphs…