
    =*j                    v    d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	  ed          Z
 G d d          ZdS )	uV  SimScheduler:事件驱动的 agent 唤醒调度(去回合制的核心)。

每个 agent 只在三种时刻被唤醒(docs/agent-runtime-v2.md §1.1):
1. 预约时刻到(动作完成 / 思考节拍);2. 被中断(高显著度事件);3. 世界关停。
asyncio 单线程驱动:堆顶睡到点 → 并发触发 handler;中断插队即时生效。
    )annotationsN)
get_logger)SimClockzruntime.schedulerc                  H    e Zd ZddZdddZddZddZddZddZddZ	dS )SimSchedulerclockr   returnNonec                    || _         g | _        t          j                    | _        t                      | _        i | _        t          j	                    | _
        d| _        d S NF)r   _heap	itertoolscount_seqset
_cancelled_pending_seqasyncioEvent_kickrunning)selfr   s     4/root/genesis-world/src/genesis/runtime/scheduler.py__init__zSimScheduler.__init__   sJ    
8:
O%%	03,.]__
    tickagent_idstr
wake_sim_sfloatreasonc                    | j                             |          }|| j                            ||f           t	          | j                  }|| j         |<   t          j        | j        ||||f           | j	        
                                 dS )uV   预约唤醒;同一 agent 的旧预约自动作废(单一待办,简化心智模型)。N)r   getr   addnextr   heapqheappushr   r   r   )r   r   r   r!   oldseqs         r   schedulezSimScheduler.schedule   s    ##H--?O300049oo&)(#tzJXv#FGGG
r   c                N    |                      || j        j        d|            dS )u9   高显著度中断:立即唤醒(取代其原有预约)。z
interrupt:N)r*   r   sim_seconds)r   r   r!   s      r   	interruptzSimScheduler.interrupt)   s,    h
 68MV8M8MNNNNNr   c                |    | j                             |d          }|| j                            ||f           dS dS )u'   agent 退场(死亡):作废其预约。N)r   popr   r$   )r   r   r(   s      r   dropzSimScheduler.drop-   sF    ##Hd33?O300000 ?r   c           	       K   d| _         | j         r| j        r| j        d         d         | j        j        k    rt	          j        | j                  \  }}}}||f| j        v r| j                            ||f           n| j        	                    |          |k    r| j        
                    |d           t          j        |                     |||                     | j        r!| j        d         d         | j        j        k    | j                                         | j        r+| j                            | j        d         d                   nd}	 t          j        | j                                        t'          t)          |d          d                     d{V  n# t          j        $ r Y nw xY w| j         dS dS )uG   handler(agent_id, reason) 为 async 回调;并发触发,互不阻塞。Tr   Ng      ?g{Gz?)timeout)r   r   r   r,   r&   heappopr   discardr   r#   r/   r   create_task_safer   clearreal_seconds_untilwait_forwaitminmaxTimeoutError)r   handlerwake_atr)   aidr!   delays          r   runzSimScheduler.run4   s     l 	* FAq!1TZ5K!K!K,1M$*,E,E)c6:00O++S#J777$((--44%))#t444#DJJwV$D$DEEE * FAq!1TZ5K!K!K JGKzZDJ11$*Q-2BCCCWZE&tz'8'8#c%QUFVFVX[B\B\]]]]]]]]]]]'    l 	 	 	 	 	s   AF( (F:9F:r@   c                   K   	  |||           d {V  d S # t           $ r  t                              d||           Y d S w xY w)Nu    agent[%s] 唤醒处理失败(%s))	Exceptionlogger	exception)r   r>   r@   r!   s       r   r6   zSimScheduler._safeG   sw      	N'#v&&&&&&&&&&& 	N 	N 	N?fMMMMMM	Ns    &AAc                F    d| _         | j                                         d S r   )r   r   r   )r   s    r   stopzSimScheduler.stopM   s!    
r   N)r   r   r	   r
   )r   )r   r   r   r    r!   r   r	   r
   )r   r   r!   r   r	   r
   )r   r   r	   r
   )r	   r
   )r@   r   r!   r   r	   r
   )
__name__
__module____qualname__r   r*   r-   r0   rB   r6   rH    r   r   r   r      s               O O O O1 1 1 1   &N N N N     r   r   )__doc__
__future__r   r   r&   r   genesis.obs.logging_setupr   genesis.runtime.simclockr   rE   r   rL   r   r   <module>rQ      s     # " " " " "       0 0 0 0 0 0 - - - - - -	'	(	(; ; ; ; ; ; ; ; ; ;r   