o
    wvXjà:  ã                   @   sF  d Z ddlmZmZ ddlZddlZddlmZmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ d
dlmZmZmZmZ d
dlmZ d
dlmZmZ d
dlmZ d
dlmZmZ d
dl m!Z! d
dl"m#Z#m$Z$ d
dl%m&Z& d
dl'm(Z( d
dl)m*Z* dZ+dZ,dZ-e!e.ƒZ/e/j0e/j1Z0Z1G dd„ de2ƒZ3G dd„ de2ƒZ4dS )zGeneric process mailbox.é    )Úabsolute_importÚunicode_literalsN)ÚdefaultdictÚdeque)Úcontextmanager)Úcopy)Úcount)Úlocal)Útimeé   )ÚExchangeÚQueueÚConsumerÚProducer)ÚLamportClock)Úmaybe_declareÚoid_from)ÚInconsistencyError)ÚrangeÚstring_t)Ú
get_logger)Úmaybe_evaluateÚreprcall)Úcached_property)Úuuid)Úmatché
   zýA node named {node.hostname} is already using this process mailbox!

Maybe you forgot to shutdown the other node or did not do so properly?
Or if you meant to start multiple nodes on the same host please make sure
you give each node a unique node name!
)ÚNodeÚMailboxc                   @   s”   e Zd ZdZdZdZdZdZdZ		ddd„Z	ddd„Z
dd	„ Zd
d„ Zddd„Z		ddd„Zddd„Zdd„ Zdd„ Zddd„ZeZdd„ ZdS )r   zMailbox node.Nc                 C   s:   || _ || _|| _|| _| jjj| _|d u ri }|| _d S ©N)ÚchannelÚmailboxÚhostnameÚstateÚclockÚadjustÚadjust_clockÚhandlers)Úselfr"   r#   r    r'   r!   © r)   úI/var/www/html/myproject/venv/lib/python3.10/site-packages/kombu/pidbox.pyÚ__init__:   s   
zNode.__init__Tc                    sP   ˆ j  ˆ j¡}‡ fdd„}||_t|pˆ j|gf||d u r!ˆ j jn|dœ|¤ŽS )Nc                    s   |rt  tjˆ d�¡ d S d S )N)Únode)ÚwarningsÚwarnÚW_PIDBOX_IN_USEÚformat)ÚnameÚmessagesÚ	consumers©r(   r)   r*   Úverify_exclusiveH   s   ÿz'Node.Consumer.<locals>.verify_exclusive)Úno_ackÚaccept)r!   Ú	get_queuer"   Úon_declaredr   r    r7   )r(   r    r6   r7   ÚoptionsÚqueuer5   r)   r4   r*   r   E   s   ÿþýzNode.Consumerc                 C   s   || j |j< |S r   )r'   Ú__name__)r(   Úfunr)   r)   r*   ÚhandlerS   s   zNode.handlerc                 C   s   t d|dd� d S )NzCannot decode message: %rr   ©Úexc_info)Úerror)r(   ÚmessageÚexcr)   r)   r*   Úon_decode_errorW   s   zNode.on_decode_errorc                 C   s&   | j ||p| jg| jd�}| ¡  |S )N)r    Ú	callbacksrD   )r   Úhandle_messagerD   Úconsume)r(   r    ÚcallbackÚconsumerr)   r)   r*   ÚlistenZ   s   
þzNode.listenc           	   
   K   s´   |pi }t dt|d|d�||ƒ |r| jp| j}z|||ƒ}W n& ty'   ‚  tyE } ztd|dd� dt|ƒi}W Y d }~nd }~ww |rX| j| j	|i|d |d	 |d
� |S )Nz1pidbox received method %s [reply_to:%s ticket:%s]r)   )Úkwargszpidbox command error: %rr   r?   rA   ÚexchangeÚrouting_key)rL   rM   Úticket)
Údebugr   Úhandle_callÚhandle_castÚ
SystemExitÚ	ExceptionrA   ÚreprÚreplyr"   )	r(   ÚmethodÚ	argumentsÚreply_torN   rK   ÚhandlerU   rC   r)   r)   r*   Údispatcha   s*   ÿ€þýzNode.dispatchc                 C   s$   |si n|}| j | | jfi |¤ŽS r   )r'   r#   ©r(   rV   rW   r)   r)   r*   rY   v   s   zNode.handlec                 C   ó   |   ||¡S r   ©rY   r[   r)   r)   r*   rP   z   ó   zNode.handle_callc                 C   r\   r   r]   r[   r)   r)   r*   rQ   }   r^   zNode.handle_castc                 C   sŠ   |  d¡}|  d¡}|  d¡}|r|  |j  d¡pd¡ | j}d}|r*||v r)d}n|r7|r7t|||ƒr6d}nd}|rC| jdi |¤ŽS d S )	NÚdestinationÚpatternÚmatcherr$   r   FTr)   )Úgetr&   Úheadersr"   r   rZ   )r(   ÚbodyrB   r_   r`   ra   r"   Úrun_dispatchr)   r)   r*   rF   €   s&   


€€ÿzNode.handle_messagec                 K   s"   | j j||||| j| j jd� d S )N)r    Ú
serializer)r!   Ú_publish_replyr    rf   )r(   ÚdatarL   rM   rN   rK   r)   r)   r*   rU   ”   s   
þz
Node.reply©NNNN)NTN©NN)NNNr   )r<   Ú
__module__Ú__qualname__Ú__doc__r"   r!   r'   r#   r    r+   r   r>   rD   rJ   rZ   rY   rP   rQ   rF   Údispatch_from_messagerU   r)   r)   r)   r*   r   (   s.    
ÿ


ÿ

r   c                   @   s  e Zd ZdZeZdZdZdZdZ	dZ
dZdZdgZdZ				d0dd	„Zd
d„ Zd1dd„Z		d1dd„Zd2dd„Zd2dd„Z		d3dd„Zdd„ Zedd„ ƒZdd„ Zed4dd„ƒZ	d4dd „Z			d5d!d"„Z				d6d$d%„Z		d3d&d'„Zd(d)„ Zd*d+„ Z ed,d-„ ƒZ!ed.d/„ ƒZ"dS )7r   zProcess Mailbox.z	%s.pidboxzreply.%s.pidboxNÚdirectÚjsonç      $@c                 C   s¢   || _ || _|| _|d u rtƒ n|| _|  | j | j¡| _|  | j ¡| _t	ƒ | _
ttƒ| _|d u r3| jn|| _|d u r=| jn|| _|| _|	| _|
| _|| _|| _d S r   )Ú	namespaceÚ
connectionÚtyper   r$   Ú_get_exchangerL   Ú_get_reply_exchangeÚreply_exchanger	   Ú_tlsr   r   Ú	unclaimedr7   rf   Ú	queue_ttlÚqueue_expiresÚreply_queue_ttlÚreply_queue_expiresÚ_producer_pool)r(   rr   rt   rs   r$   r7   rf   Úproducer_poolrz   r{   r|   r}   r)   r)   r*   r+   ¶   s   

zMailbox.__init__c                 C   s   t | ƒ}||_|S r   )r   rs   )r(   rs   Úboundr)   r)   r*   Ú__call__Ë   s   zMailbox.__call__c                 C   s    |pt  ¡ }| j||||| d�S )N)r!   )ÚsocketÚgethostnameÚnode_cls)r(   r"   r#   r    r'   r)   r)   r*   r   Ð   s   zMailbox.Nodec              	   C   s$   |si n|}| j |||d|||d�S )NT)rU   ÚtimeoutrH   r    ©Ú
_broadcast)r(   r_   ÚcommandrK   r…   rH   r    r)   r)   r*   ÚcallÔ   ó   
ýzMailbox.callc                 C   s   |si n|}| j |||dd�S ©NF)rU   r†   )r(   r_   rˆ   rK   r)   r)   r*   ÚcastÜ   s   zMailbox.castc                 C   s   |si n|}| j ||dd�S r‹   r†   )r(   rˆ   rK   r)   r)   r*   Úabcastà   s   zMailbox.abcastr   c              	   C   s$   |si n|}| j ||d||||d�S )NT)rU   r…   ÚlimitrH   r    r†   )r(   rˆ   rK   r…   rŽ   rH   r    r)   r)   r*   Ú
multi_callä   rŠ   zMailbox.multi_callc              	   C   s.   | j }td|| jjf | j|dd| j| jd�S )Nz%s.%sFT)rL   rM   ÚdurableÚauto_deleteÚexpiresÚmessage_ttl)Úoidr   rw   r1   r}   r|   ©r(   r”   r)   r)   r*   Úget_reply_queueì   s   ùzMailbox.get_reply_queuec                 C   s   |   ¡ S r   )r–   r4   r)   r)   r*   Úreply_queueø   s   zMailbox.reply_queuec                 C   s$   t d|| jf | jdd| j| jd�S )Nz%s.%s.pidboxFT)rL   r�   r‘   r’   r“   )r   rr   rL   r{   rz   )r(   r"   r)   r)   r*   r8   ü   s   úzMailbox.get_queuec                 c   s^   � |r|V  d S | j r&| j  ¡ �}|V  W d   ƒ d S 1 sw   Y  d S t|dd�V  d S )NF)Úauto_declare)r   Úacquirer   )r(   Úproducerr    r)   r)   r*   Úproducer_or_acquire  s   €
"ÿzMailbox.producer_or_acquirec           	   	   K   s¢   |p| j j}t|dddd�}|  ||¡�3}z|j|f|||g|| j ¡ dœddœ|¤Ž W n	 ty6   Y n	w W d   ƒ d S W d   ƒ d S 1 sJw   Y  d S )Nro   Ú	transientF)Úexchange_typeÚdelivery_moder�   )rN   r$   T)rL   rM   Údeclarerc   Úretry)rs   Údefault_channelr   r›   Úpublishr$   Úforwardr   )	r(   rU   rL   rM   rN   r    rš   ÚoptsÚchanr)   r)   r*   rg     s2   þÿ
ÿü
ûþùþ"õzMailbox._publish_replyc              	   C   s¾   ||||	|
dœ}|p| j j}| j}|r't|  |¡ƒ |j|| jj| jdœd� |p+| j	}|  
||¡�#}|j||j|g| j ¡ |rEtƒ | nddœ|dd� W d   ƒ d S 1 sXw   Y  d S )N)rV   rW   r_   r`   ra   )rL   rM   )rN   rX   r   )r$   r’   T)rL   rŸ   rc   rf   r    )rs   r¡   rL   r   r—   Úupdaterw   r1   r”   rf   r›   r¢   r$   r£   r
   )r(   rt   rW   r_   Úreply_ticketr    r…   rf   rš   r`   ra   rB   r¥   rL   r)   r)   r*   Ú_publish#  s2   üÿÿ

ÿü"ÿzMailbox._publishFc                 C   sä   |d urt |ttfƒstd t|ƒ¡ƒ‚|
d ur2t |
tƒs2|d ur2t |tƒs2td t|
ƒt|ƒ¡ƒ‚|p5i }|r;tƒ p<d }|pB| jj	}|d u rQ|rQ|rOt
|ƒpPd }|	pU| j}	| j|||||||	|
|d�	 |rp| j|||||d�S d S )Nz(destination must be a list/tuple not {0}z.pattern and matcher must be strings not {}, {})r_   r§   r    r…   rf   r`   ra   )rŽ   r…   rH   r    )Ú
isinstanceÚlistÚtupleÚ
ValueErrorr0   rt   r   r   rs   r¡   Úlenrf   r¨   Ú_collect)r(   rˆ   rW   r_   rU   r…   rŽ   rH   r    rf   r`   ra   r§   r¥   r)   r)   r*   r‡   ;  sF   ÿÿÿþ

úýÿzMailbox._broadcastc              
      s  |d u r| j }|p| jj}| j}t||g|dd�}	g ‰| j‰| jj‰ zˆ ˆ¡W S  t	y1   Y nw ‡ ‡‡‡‡fdd„}
|	 
|
¡ zD|	�1 |rKt|ƒpMtƒ D ]}z	| jj|d� W qN tjyd   Y  nw ˆW  d   ƒ W | |j¡ S 1 sxw   Y  W | |j¡ d S | |j¡ w )NT)r7   r6   c                    sp   |j j}ˆ |dƒp
dƒ |dƒ}|rtƒ |krd S |dˆƒ}|ˆkr/ˆr(ˆ| ƒ ˆ | ¡ d S ˆ|  | ¡ d S )Nr$   r   r’   rN   )rc   rb   r
   Úappend)rd   rB   Úheaderr’   Úthis_id©r&   rH   Ú	responsesrN   ry   r)   r*   Ú
on_messages  s   
z$Mailbox._collect.<locals>.on_message)r…   )r7   rs   r¡   r—   r   ry   r$   r%   ÚpopÚKeyErrorÚregister_callbackr   r   Údrain_eventsr‚   r…   Úafter_reply_message_receivedr1   )r(   rN   rŽ   r…   rH   r    r7   r¥   r;   rI   r´   Úir)   r²   r*   r®   b  s8   ÿ
ÿúøzMailbox._collectc                 C   s   t | j| |ddd�S )NFrœ   ©rt   r�   rž   )r   Úexchange_fmt)r(   rr   rt   r)   r)   r*   ru   Ž  ó
   
ýzMailbox._get_exchangec                 C   s   t | j| dddd�S )Nro   Frœ   r»   )r   Úreply_exchange_fmt)r(   rr   r)   r)   r*   rv   ”  r½   zMailbox._get_reply_exchangec                 C   s2   z| j jW S  ty   t| ƒ }| j _| Y S w r   )rx   ÚOIDÚAttributeErrorr   r•   r)   r)   r*   r”   š  s   
þzMailbox.oidc                 C   s
   t | jƒS r   )r   r~   r4   r)   r)   r*   r   ¢  s   
zMailbox.producer_pool)
ro   NNNNNNNNrq   ri   r   )Nr   NNNrj   )NNNNNNNN)
NNFr   NNNNNN)#r<   rk   rl   rm   r   r„   r¼   r¾   rr   rs   rt   rL   rw   r7   rf   r+   r�   r‰   rŒ   r�   r�   r–   r   r—   r8   r   r›   rg   r¨   r‡   r®   ru   rv   r”   r   r)   r)   r)   r*   r   š   sj    
ü

ÿ


ÿ



ÿ
þ
ý(
þ,
r   )5rm   Ú
__future__r   r   r‚   r-   Úcollectionsr   r   Ú
contextlibr   r   Ú	itertoolsr   Ú	threadingr	   r
   Ú r   r   r   r   Úclocksr   Úcommonr   r   Ú
exceptionsr   Úfiver   r   Úlogr   Úutils.functionalr   r   Úutils.objectsr   Ú
utils.uuidr   ra   r   ÚREPLY_QUEUE_EXPIRESr/   Ú__all__r<   ÚloggerrO   rA   Úobjectr   r   r)   r)   r)   r*   Ú<module>   s6    r