Ë
    —V.jE(  ã                   óN  — d Z ddlZddlZddl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 dd	lmZ dd
lmZ dZi Zd„ Z ed«       G d„ d«      «       Z G d„ de«      Z ed«       G d„ de«      «       Z ed«       G d„ de«      «       Z G d„ d«      Z G d„ d«      Zy)z$Async I/O backend support utilities.é    N)Údeque)ÚEmpty)Úsleep)ÚWeakKeyDictionary)Údetect_environment)Ústates)ÚTimeoutError)ÚTHREAD_TIMEOUT_MAX)ÚAsyncBackendMixinÚBaseResultConsumerÚDrainerÚregister_drainerc                 ó   ‡ — ˆ fd„}|S )z5Decorator used to register a new result drainer type.c                 ó   •— | t         ‰<   | S ©N)Údrainers)ÚclsÚnames    €ú^C:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\celery/backends/asynchronous.pyÚ_innerz register_drainer.<locals>._inner   s   ø€ ØŒ�‰Øˆ
ó    © )r   r   s   ` r   r   r      s   ø€ ôð €Mr   Údefaultc                   ó2   — e Zd ZdZd„ Zd„ Zd„ Zdd„Zd	d„Zy)
r   zResult draining service.c                 ó   — || _         y r   )Úresult_consumer)Úselfr   s     r   Ú__init__zDrainer.__init__$   s
   € Ø.ˆÕr   c                  ó   — y r   r   ©r   s    r   ÚstartzDrainer.start'   ó   € Ør   c                  ó   — y r   r   r    s    r   ÚstopzDrainer.stop*   r"   r   Nc              #   óV  K  — |xs | j                   j                  }t        j                  «       }	 |r.t        j                  «       |z
  |k\  rt	        j
                  «       ‚	 | j                  |||¬«      –— |r |«        |j                  ry Œ^# t        j
                  $ r Y Œ,w xY w­w©N©Útimeout)r   Údrain_eventsÚtimeÚ	monotonicÚsocketr(   Úwait_forÚready)r   Úpr(   ÚintervalÚon_intervalÚwaitÚ
time_starts          r   Údrain_events_untilzDrainer.drain_events_until-   s˜   è ø€ ØÒ8�t×+Ñ+×8Ñ8ˆÜ—^‘^Ó%ˆ
àáœ4Ÿ>™>Ó+¨jÑ8¸GÒCÜ—n‘nÓ&Ð&ðØ—m‘m A t°X�mÓ>Ò>ñ Ù”Ø�wŠwØð øô —>‘>ò Ùðüs*   ‚A B)Á#B Á9B)ÂB&Â#B)Â%B&Â&B)c                 ó   —  ||¬«       y r&   r   ©r   r/   r2   r(   s       r   r-   zDrainer.wait_for>   s
   € Ù�WÖr   )Né   NNr   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r!   r$   r4   r-   r   r   r   r   r       s   „ á"ò/òòóô"r   r   c                   óP   ‡ — e Zd ZdZdZdZd„ Zd„ Zˆ fd„Zd„ Z	d„ Z
d„ Zd	d„Zˆ xZS )
ÚgreenletDrainerNc                  ó   — y)z,create new self._drain_complete_event objectNr   r    s    r   Ú_create_drain_complete_eventz,greenletDrainer._create_drain_complete_eventG   ó   € àr   c                  ó   — y)z5raise self._drain_complete_event for wakeup .wait_forNr   r    s    r   Ú_send_drain_complete_eventz*greenletDrainer._send_drain_complete_eventK   r@   r   c                 óÚ   •— t        ‰| �  |i |¤Ž t        j                  «       | _        t        j                  «       | _        t        j                  «       | _        | j                  «        y r   )Úsuperr   Ú	threadingÚEventÚ_startedÚ_stoppedÚ	_shutdownr?   )r   ÚargsÚkwargsÚ	__class__s      €r   r   zgreenletDrainer.__init__O   sK   ø€ Ü‰Ñ˜$Ð) &Ò)Ü!Ÿ™Ó)ˆŒÜ!Ÿ™Ó)ˆŒÜ"Ÿ™Ó*ˆŒØ×)Ñ)Õ+r   c                 ó‚  — | j                   j                  «        | j                  j                  «       sX	 | j                  j                  d¬«       | j                  «        | j                  «        | j                  j                  «       sŒX| j                  j                  «        y # t        j                  $ r Y ŒKw xY w)Nr7   r'   )rG   ÚsetrH   Úis_setr   r)   rB   r?   r,   r(   rI   r    s    r   ÚrunzgreenletDrainer.runV   s’   € Ø�‰×ÑÔØ—-‘-×&Ñ&Ô(ðØ×$Ñ$×1Ñ1¸!Ð1Ô<Ø×/Ñ/Ô1Ø×1Ñ1Ô3ð	 —-‘-×&Ñ&Õ(ð 	�‰×ÑÕøô —>‘>ò Ùðús   ¶<B( Â(B>Â=B>c                 ó®   — | j                   j                  «       s;| j                  | j                  «      | _        | j                   j                  «        y y r   )rG   rO   ÚspawnrP   Ú_gr2   r    s    r   r!   zgreenletDrainer.starta   s;   € Ø�}‰}×#Ñ#Ô%Ø—j‘j §¡Ó*ˆDŒGØ�M‰M×ÑÕ ð &r   c                 ó–   — | j                   j                  «        | j                  «        | j                  j	                  t
        «       y r   )rH   rN   rB   rI   r2   r
   r    s    r   r$   zgreenletDrainer.stopf   s1   € Ø�‰×ÑÔØ×'Ñ'Ô)Ø�‰×ÑÔ.Õ/r   c                 óv   — | j                  «        |j                  s| j                  j                  |¬«       y y r&   )r!   r.   Ú_drain_complete_eventr2   r6   s       r   r-   zgreenletDrainer.wait_fork   s.   € Ø�
‰
ŒØ�wŠwØ×&Ñ&×+Ñ+°GÐ+Õ<ð r   r   )r8   r9   r:   rR   rS   rV   r?   rB   r   rP   r!   r$   r-   Ú__classcell__)rL   s   @r   r=   r=   B   s6   ø„ Ø€EØ	€BØ Ðòòô,ò	ò!ò
0÷
=r   r=   Úeventletc                   ó   — e Zd Zd„ Zd„ Zd„ Zy)ÚeventletDrainerc                 ó6   — ddl m}m}  ||«      } |d«       |S )Nr   )r   rR   )rX   r   rR   )r   Úfuncr   rR   Úgs        r   rR   zeventletDrainer.spawnt   s   € ß)Ù�$‹KˆÙˆaŒØˆr   c                 ó(   — ddl m}  |«       | _        y ©Nr   )rF   )Úeventlet.eventrF   rV   ©r   rF   s     r   r?   z,eventletDrainer._create_drain_complete_eventz   s   € Ý(Ù%*£WˆÕ"r   c                 ó8   — | j                   j                  «        y r   )rV   Úsendr    s    r   rB   z*eventletDrainer._send_drain_complete_event~   s   € Ø×"Ñ"×'Ñ'Õ)r   N©r8   r9   r:   rR   r?   rB   r   r   r   rZ   rZ   q   s   „ òò-ó*r   rZ   Úgeventc                   ó   — e Zd Zd„ Zd„ Zd„ Zy)ÚgeventDrainerc                 óR   — dd l }|j                  |«      }|j                  d«       |S )Nr   )re   rR   r   )r   r\   re   r]   s       r   rR   zgeventDrainer.spawn…   s#   € ÛØ�L‰L˜ÓˆØ�‰�QŒØˆr   c                 ó(   — ddl m}  |«       | _        y r_   )Úgevent.eventrF   rV   ra   s     r   r?   z*geventDrainer._create_drain_complete_event‹   s   € Ý&Ù%*£WˆÕ"r   c                 óX   — | j                   j                  «        | j                  «        y r   )rV   rN   r?   r    s    r   rB   z(geventDrainer._send_drain_complete_event�   s    € Ø×"Ñ"×&Ñ&Ô(Ø×)Ñ)Õ+r   Nrd   r   r   r   rg   rg   ‚   s   „ òò-ó,r   rg   c                   ór   — e Zd ZdZd„ Zdd„Zdd„Zd„ Zdd„Zdd„Z	d„ Z
d	„ Zd
„ Z	 dd„Z	 dd„Zed„ «       Zy)r   z.Mixin for backends that enables the async API.c                 ó6   — || j                   j                  |<   y r   )r   Úbuckets)r   ÚresultÚbuckets      r   Ú_collect_intozAsyncBackendMixin._collect_into—   s   € Ø/5ˆ×Ñ×$Ñ$ VÒ,r   c              +   ó\  K  — | j                  «        |j                  }|s
t        «       ‚t        «       }|D ]P  }t	        |d«      s|j                  |«       Œ!|j                  r|j                  |«       Œ?| j                  ||«       ŒR  | j                  |fd|i|¤ŽD ]Y  }|sŒ|j                  «       }t	        |d«      s|j                  |j                  f–— n|j                  |j                  f–— |rŒTŒ[ |r.|j                  «       }|j                  |j                  f–— |rŒ-y y ­w)NÚ_cacheÚno_ack)Ú_ensure_not_eagerÚresultsÚStopIterationr   ÚhasattrÚappendrs   rq   Ú_wait_for_pendingÚpopleftÚidÚchildren)r   ro   rt   rK   rv   rp   ÚnodeÚ_s           r   Úiter_nativezAsyncBackendMixin.iter_nativeš   s  è ø€ Ø×ÑÔ à—.‘.ˆÙÜ“/Ð!ô “ˆÛˆDÜ˜4 Ô*Ø—‘˜dÕ#Ø—’Ø—‘˜dÕ#à×"Ñ" 4¨Õ0ð ð (�×'Ñ'¨ÑH°vÐHÀÔHˆAÚØ—~‘~Ó'�Ü˜t XÔ.ØŸ'™' 4§=¡=Ð0Ó0àŸ'™' 4§;¡;Ð.Ò.ó ð Iñ Ø—>‘>Ó#ˆDØ—'‘'˜4Ÿ;™;Ð&Ò&ô ùs   ‚B"D,Â%AD,Ã90D,Ä*D,c                 óÒ   — |r$| j                   j                  j                  «        	 | j                  |«       |S # t        $ r" | j                  |j                  ||¬«       Y |S w xY w)N)Úweak)r   Údrainerr!   Ú_maybe_resolve_from_bufferr   Ú_add_pending_resultr|   )r   ro   r‚   Ústart_drainers       r   Úadd_pending_resultz$AsyncBackendMixin.add_pending_result·   si   € ÙØ× Ñ ×(Ñ(×.Ñ.Ô0ð	CØ×+Ñ+¨FÔ3ð ˆøô ò 	CØ×$Ñ$ V§Y¡Y°¸TÐ$ÕBØˆð	Cús   ¨; »'A&Á%A&c                 ól   — |j                  | j                  j                  |j                  «      «       y r   )Ú_maybe_set_cacheÚ_pending_messagesÚtaker|   ©r   ro   s     r   r„   z,AsyncBackendMixin._maybe_resolve_from_bufferÀ   s%   € Ø×Ñ × 6Ñ 6× ;Ñ ;¸F¿I¹IÓ FÕGr   c                 ó’   — | j                   \  }}||vr4|j                  |vr%||r|n||<   | j                  j                  |«       y y y r   )Ú_pending_resultsr|   r   Úconsume_from)r   Útask_idro   r‚   ÚconcreteÚweak_s         r   r…   z%AsyncBackendMixin._add_pending_resultÃ   sN   € Ø×/Ñ/‰ˆ�%Ø˜%Ñ F§I¡I°XÑ$=Ø5;‘d‰U ¨'Ñ2Ø× Ñ ×-Ñ-¨gÕ6ð %>Ðr   c                 ó˜   — | j                   j                  j                  «        |D �cg c]  }| j                  ||d¬«      ‘Œ c}S c c}w )NF)r‚   r†   )r   rƒ   r!   r‡   )r   rv   r‚   ro   s       r   Úadd_pending_resultsz%AsyncBackendMixin.add_pending_resultsÉ   sQ   € Ø×Ñ×$Ñ$×*Ñ*Ô,á%ó'Ù%�Fð ×'Ñ'¨°TÈÐ'ÕOØ%ñ'ð 	'ùò 's   ©Ac                 ó^   — | j                  |j                  «       | j                  |«       |S r   )Ú_remove_pending_resultr|   Úon_result_fulfilledrŒ   s     r   Úremove_pending_resultz'AsyncBackendMixin.remove_pending_resultÎ   s'   € Ø×#Ñ# F§I¡IÔ.Ø× Ñ  Ô(Øˆr   c                 óJ   — | j                   D ]  }|j                  |d «       Œ y r   )rŽ   Úpop©r   r�   Úmappings      r   r–   z(AsyncBackendMixin._remove_pending_resultÓ   s    € Ø×,Ô,ˆGØ�K‰K˜ Õ&ñ -r   c                 óN   — | j                   j                  |j                  «       y r   )r   Ú
cancel_forr|   rŒ   s     r   r—   z%AsyncBackendMixin.on_result_fulfilled×   s   € Ø×Ñ×'Ñ'¨¯	©	Õ2r   Nc                 óx   — | j                  «         | j                  |fi |¤ŽD ]  }Œ |j                  ||¬«      S )N)ÚcallbackÚ	propagate)ru   rz   Úmaybe_throw)r   ro   r    r¡   rK   r   s         r   Úwait_for_pendingz"AsyncBackendMixin.wait_for_pendingÚ   sC   € à×ÑÔ Ø'�×'Ñ'¨Ñ9°&Ô9ˆAØð :à×!Ñ!¨8¸yÐ!ÓIÐIr   c                 óD   —  | j                   j                  |f|||dœ|¤ŽS )N)r(   r1   Ú
on_message)r   rz   )r   ro   r(   r1   r¥   rK   s         r   rz   z#AsyncBackendMixin._wait_for_pendingá   s9   € ð 6ˆt×#Ñ#×5Ñ5Øð
Ø#Ø#°
ñ
ð ñ
ð 	
r   c                  ó   — y©NTr   r    s    r   Úis_asynczAsyncBackendMixin.is_asyncê   s   € àr   )T)FT)Fr§   ©NNN)r8   r9   r:   r;   rq   r€   r‡   r„   r…   r”   r˜   r–   r—   r£   rz   Úpropertyr¨   r   r   r   r   r   ”   s^   „ Ù8ò6ó'ó:òHó7ó'ò
ò
'ò3ð 37óJð FJó
ð ñó ñr   r   c                   ón   — e Zd ZdZd„ Zd„ Zd„ Zdd„Zd„ Zd„ Z	d	„ Z
d
„ Zdd„Z	 dd„Zdd„Zd„ Zd„ Zd„ Zy)r   z2Manager responsible for consuming result messages.c                 ó¬   — || _         || _        || _        || _        || _        d | _        t        «       | _        t        t        «          | «      | _
        y r   )ÚbackendÚappÚacceptrŽ   rŠ   r¥   r   rn   r   r   rƒ   )r   r­   r®   r¯   Úpending_resultsÚpending_messagess         r   r   zBaseResultConsumer.__init__ò   sM   € àˆŒØˆŒØˆŒØ /ˆÔØ!1ˆÔØˆŒÜ(Ó*ˆŒÜÔ 2Ó 4Ñ5°dÓ;ˆ�r   c                 ó   — t        «       ‚r   ©ÚNotImplementedError)r   Úinitial_task_idrK   s      r   r!   zBaseResultConsumer.startý   ó   € Ü!Ó#Ð#r   c                  ó   — y r   r   r    s    r   r$   zBaseResultConsumer.stop   r"   r   Nc                 ó   — t        «       ‚r   r³   )r   r(   s     r   r)   zBaseResultConsumer.drain_events  r¶   r   c                 ó   — t        «       ‚r   r³   ©r   r�   s     r   r�   zBaseResultConsumer.consume_from  r¶   r   c                 ó   — t        «       ‚r   r³   rº   s     r   rž   zBaseResultConsumer.cancel_for	  r¶   r   c                 ó„   — | j                   j                  «        t        «       | _         d | _        | j	                  «        y r   )rn   Úclearr   r¥   Úon_after_forkr    s    r   Ú_after_forkzBaseResultConsumer._after_fork  s/   € Ø�‰×ÑÔÜ(Ó*ˆŒØˆŒØ×ÑÕr   c                  ó   — y r   r   r    s    r   r¾   z BaseResultConsumer.on_after_fork  r"   r   c                 ó>   — | j                   j                  |||¬«      S )N©r(   r1   )rƒ   r4   )r   r/   r(   r1   s       r   r4   z%BaseResultConsumer.drain_events_until  s%   € Ø�|‰|×.Ñ.Ø�w¨Kð /ó 9ð 	9r   c              +   ó0  K  —  | j                   |fd|i|¤Ž | j                  |c}| _        	 | j                  |j                  ||¬«      D ]  }d –— t	        d«       Œ 	 || _        y # t
        j                  $ r t        d«      ‚w xY w# || _        w xY w­w)Nr(   rÂ   r   zThe operation timed out.)Úon_wait_for_pendingr¥   r4   Úon_readyr   r,   r(   r	   )r   ro   r(   r1   r¥   rK   Ú	prev_on_mr   s           r   rz   z$BaseResultConsumer._wait_for_pending  sž   è ø€ ð 	!ˆ× Ñ  ÑC°ÐC¸FÒCØ%)§_¡_°jÐ"ˆ	�4”?ð		(Ø×,Ñ,Ø—O‘O¨WØ +ð -ö -�ó Ü�a•ñ	-ð (ˆD�Oøô �~‰~ò 	;ÜÐ9Ó:Ð:ð	;ûð (ˆD�Oüs(   ‚*B­2A( Á BÁ(BÂB
 Â
	BÂBc                  ó   — y r   r   )r   ro   r(   rK   s       r   rÄ   z&BaseResultConsumer.on_wait_for_pending)  r"   r   c                 ó<   — | j                  |j                  |«       y r   )Úon_state_changeÚpayload)r   Úmessages     r   Úon_out_of_band_resultz(BaseResultConsumer.on_out_of_band_result,  s   € Ø×Ñ˜WŸ_™_¨gÕ6r   c                 óf   — | j                   D ]	  }	 ||   c S  t        |«      ‚# t        $ r Y Œ"w xY wr   )rŽ   ÚKeyErrorr›   s      r   Ú_get_pending_resultz&BaseResultConsumer._get_pending_result/  sC   € Ø×,Ô,ˆGðØ˜wÑ'Ò'ð -ô
 �wÓÐøô ò Ùðús   ‘$¤	0¯0c                 ó   — | j                   r| j                  |«       |d   t        j                  v rW|d   }	 | j                  |«      }|j	                  |«       | j
                  }	 |j                  |«      }|j                  |«       t        d«       y # t        $ r Y Œw xY w# t        $ r | j                  j                  ||«       Y ŒBw xY w)NÚstatusr�   r   )r¥   r   ÚREADY_STATESrÏ   r‰   rn   rš   ry   rÎ   rŠ   Úputr   )r   ÚmetarË   r�   ro   rn   rp   s          r   rÉ   z"BaseResultConsumer.on_state_change7  sÂ   € Ø�?Š?Ø�O‰O˜DÔ!Ø�‰>œV×0Ñ0Ñ0Ø˜9‘oˆGð*Ø×1Ñ1°'Ó:�ð ×'Ñ'¨Ô-ØŸ,™,�ð*à$Ÿ[™[¨Ó0�Fð
 —M‘M &Ô)Üˆa�øô  ò Ùðûô ò :ð ×&Ñ&×*Ñ*¨7°DÖ9ð:ús#   ¹B% Á(B Â	B"Â!B"Â%%CÃCr   )NNr©   )r8   r9   r:   r;   r   r!   r$   r)   r�   rž   r¿   r¾   r4   rz   rÄ   rÌ   rÏ   rÉ   r   r   r   r   r   ï   sR   „ Ù<ò	<ò$òó$ò$ò$òòó9ð
 FJó(ó ò7ò ór   r   )r;   r,   rE   r*   Úcollectionsr   Úqueuer   r   Úweakrefr   Úkombu.utils.compatr   Úceleryr   Úcelery.exceptionsr	   Úcelery.utils.threadsr
   Ú__all__r   r   r   r=   rZ   rg   r   r   r   r   r   Ú<module>rÝ      sÁ   ðÙ *Û Û Û Ý Ý Ý Ý %å 1å Ý *Ý 3ð€ð
 €òñ �)Ó÷ð ó ðôB,=�gô ,=ñ^ �*Óô*�oó *ó ð*ñ  �(Óô,�Oó ,ó ð,÷"Xñ X÷v^ò ^r   