ó
    üÞ jû”  ã                   ó  • S SK r S SKrS SKrS SKrS SKrS SKJr  S SKJr  S SK	J	r	J
r
Jr  S SKJr  S SKJr  S SKJr  S SKJrJrJrJrJrJr  S S	KJrJr  S S
KJr  S SKJrJrJrJ r J!r!J"r"  SSK#J$r$J%r%J&r&J'r'  SSK(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2  SSK3J4r4J5r5J6r6J7r7J8r8J9r9J:r:J;r;J<r<  \(       a  SSKJ=r=J>r>J?r?J@r@  \R‚                  " S5      rB\C" 5       rD\ " S S5      5       rESSSSSS.S\\F\ES4   S\\F   S\S   S\S   S\\G   S\\H   S\E4S jjrI " S S \J5      rK " S! S"\J5      rL " S# S$\J5      rM " S% S&\J5      rN " S' S(5      rOS)S*S\P\F\Q4   4S+ jrRS)S*S,\S\O4S- jrSS)S*S,\S\O4S. jrT S4S/\\%   S0\\F   S1\\F   S\H4S2 jjrUS)S*S\H4S3 jrVg)5é    N)ÚSequence)Ú	dataclass)ÚdatetimeÚ	timedeltaÚtimezone)Úpartial)ÚSignals)Útime)ÚTYPE_CHECKINGÚAnyÚCallableÚOptionalÚUnionÚcast)ÚResponseErrorÚ
WatchError)ÚCronJob)ÚDeserializerÚ	JobResultÚSerializationErrorÚ
SerializerÚdeserialize_job_rawÚserialize_resulté   )ÚArqRedisÚRedisSettingsÚcreate_poolÚlog_redis_info)
Úabort_job_max_ageÚabort_jobs_ssÚdefault_queue_nameÚexpires_extra_msÚhealth_check_key_suffixÚin_progress_key_prefixÚjob_key_prefixÚkeep_cronjob_progressÚresult_key_prefixÚretry_key_prefix)	Úargs_to_stringÚimport_stringÚms_to_datetimeÚpollÚtimestamp_msÚto_msÚ
to_secondsÚ
to_unix_msÚtruncate)ÚSecondsTimedeltaÚStartupShutdownÚWorkerCoroutineÚWorkerSettingsTypez
arq.workerc                   ój   • \ rS rSr% \\S'   S\S'   \\   \S'   \\   \S'   \\   \S'   \\	   \S'   S	r
g
)ÚFunctioné3   Únamer4   Ú	coroutineÚ	timeout_sÚkeep_result_sÚkeep_result_foreverÚ	max_tries© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__ÚstrÚ__annotations__r   ÚfloatÚboolÚintÚ__static_attributes__r?   ó    ÚD/var/www/html/gaurav/venv/lib/python3.13/site-packages/arq/worker.pyr7   r7   3   s5   ‡ à
ƒIØ Ó Ø˜‰ÓØ˜E‘?Ó"Ø! $™Ó'Ø˜‰}ÖrJ   r7   )r9   Úkeep_resultÚtimeoutr=   r>   r:   r4   r9   rL   r2   rM   r=   r>   Úreturnc                óL  • [        U [        5      (       a  U $ [        U [        5      (       a  U=(       d    U n[        U 5      nOU n[        R
                  " U5      (       d  [        U S35      e[        U5      n[        U5      n[        U=(       d    UR                  XcX$U5      $ )a,  
Wrapper for a job function which lets you configure more settings.

:param coroutine: coroutine function to call, can be a string to import
:param name: name for function, if None, ``coroutine.__qualname__`` is used
:param keep_result: duration to keep the result for, if 0 the result is not kept
:param keep_result_forever: whether to keep results forever, if None use Worker default, wins over ``keep_result``
:param timeout: maximum time the job should take
:param max_tries: maximum number of tries allowed for the function, use 1 to prevent retrying
z is not a coroutine function)	Ú
isinstancer7   rD   r*   ÚinspectÚiscoroutinefunctionÚRuntimeErrorr/   rB   )r:   r9   rL   rM   r=   r>   Ú
coroutine_s          rK   ÚfuncrU   =   s’   € ô& �)œX×&Ñ&ØÐä�)œS×!Ñ!Ø× �yˆÜ&3°IÓ&>‰
àˆ
ä×&Ò& z×2Ñ2Ü˜j˜\Ð)EÐFÓGÐGÜ˜Ó!€GÜ˜[Ó)€Kä�D×3˜J×3Ñ3°ZÈ+ÐluÓvÐvrJ   c                   óL   • \ rS rSrSrSS\S   4S jjrS\4S jrS\4S	 jr	S
r
g)ÚRetryéa   z…
Special exception to retry the job (if ``max_tries`` hasn't been reached).

:param defer: duration to wait before rerunning the job
NÚdeferr2   c                 ó$   • [        U5      U l        g ©N)r.   Údefer_score)ÚselfrY   s     rK   Ú__init__ÚRetry.__init__h   s   € Ü*/°«,ˆÕrJ   rN   c                 ó<   • SU R                   =(       d    SS-  S S3$ )Nz<Retry defer r   éè  ú0.2fzs>©r\   ©r]   s    rK   Ú__repr__ÚRetry.__repr__k   s$   € Ø × 0Ñ 0× 5°A¸Ñ=¸dÐCÀ2ÐFÐFrJ   c                 ó   • [        U 5      $ r[   )Úreprrd   s    rK   Ú__str__ÚRetry.__str__n   s   € Ü�D‹zÐrJ   rc   r[   )r@   rA   rB   rC   Ú__doc__r   r^   rD   re   ri   rI   r?   rJ   rK   rW   rW   a   s3   † ññ7˜hÐ'9Ñ:õ 7ðG˜#ô Gð˜÷ rJ   rW   c                   ó&   • \ rS rSrS\S\4S jrSrg)ÚJobExecutionFailedér   ÚotherrN   c                 ó`   • [        U[        5      (       a  U R                  UR                  :H  $ g)NF)rP   rm   Úargs)r]   ro   s     rK   Ú__eq__ÚJobExecutionFailed.__eq__s   s&   € Ü�eÔ/×0Ñ0Ø—9‘9 §
¡
Ñ*Ð*ØrJ   r?   N)r@   rA   rB   rC   r   rG   rr   rI   r?   rJ   rK   rm   rm   r   s   † ð˜Cð  D÷ rJ   rm   c                   óH   • \ rS rSrS\S\\   4S jrS\4S jr	S\4S jr
Srg	)
Ú
FailedJobséy   ÚcountÚjob_resultsc                 ó   • Xl         X l        g r[   ©rw   rx   )r]   rw   rx   s      rK   r^   ÚFailedJobs.__init__z   s   € ØŒ
Ø&ÕrJ   rN   c                 óæ   • U R                   S:X  a0  U R                  (       a  U R                  S   R                  nSU< 3$ U R                    S3SR                  S U R                   5       5      -   $ )Nr   r   z1 job failed z jobs failed:
Ú
c              3   óJ   #   • U H  n[        UR                  5      v •  M     g 7fr[   )rh   Úresult)Ú.0Úrs     rK   Ú	<genexpr>Ú%FailedJobs.__str__.<locals>.<genexpr>ƒ   s   é € Ð=gÑVfÐQR¼dÀ1Ç8Á8¿n¸nÒVfùs   ‚!#)rw   rx   r   Újoin)r]   Úexcs     rK   ri   ÚFailedJobs.__str__~   sd   € Ø�:‰:˜‹?˜t×/×/Ø×"Ñ" 1Ñ%×,Ñ,ˆCØ" 3¡'Ð*Ð*à—j‘j�\ Ð1°D·I±IÑ=gÐVZ×VfÒVfÓ=gÓ4gÑgÐgrJ   c                 ó    • S[        U 5       S3$ )NÚ<Ú>)rD   rd   s    rK   re   ÚFailedJobs.__repr__…   s   € Ø”3�t“9�+˜QÐÐrJ   rz   N)r@   rA   rB   rC   rH   Úlistr   r^   rD   ri   re   rI   r?   rJ   rK   ru   ru   y   s3   † ð'˜cð '°°Y±ô 'ðh˜ô hð ˜#÷  rJ   ru   c                   ó   • \ rS rSrSrg)ÚRetryJobé‰   r?   N)r@   rA   rB   rC   rI   r?   rJ   rK   r�   r�   ‰   s   † ÚrJ   r�   c            @       ó   • \ rS rSrSr SW\SSSSSSSSSSSSSS	SS
SSS	SSSSSSS\SSS.S\\\	S4      S\
\   S\
\\      S\
\   S\
\   S\S\
S   S\
S   S\
S   S\
S   S\
S   S\S\S\SSS SS!\S"SS#\
\   S$\S%SS&\
\   S'\
\\\4      S(\S)\S*\S+\
\   S,\
\   S-\S.\
\   S/\4>S0 jjjrSXS2 jrSXS3 jrSYS(\
\   S*\
\   S1\4S4 jjr\S1\4S5 j5       rSXS6 jrSXS7 jrSXS8 jrSXS9 jrS:\ \!   S1S4S; jr"S<\S=\S1S4S> jr#S<\S?\S@\
\!   SA\
\$   S!\SB\
\   SC\
\$   S1S4SD jr%S<\S@\
\!   S1S4SE jr&SXSF jr'SZSG\(SH\$SI\S1S4SJ jjr)SXSK jr*SL\+SM\,\+/S4   S1S4SN jr-S1\4SO jr.SXSP jr/SL\+S1S4SQ jr0SL\+S1S4SR jr1SL\+S1S4SS jr2SXST jr3S1\4SU jr4SVr5g)[ÚWorkeré�   aÖ
  
Main class for running jobs.

:param functions: list of functions to register, can either be raw coroutine functions or the
  result of :func:`arq.worker.func`.
:param queue_name: queue name to get jobs from
:param cron_jobs:  list of cron jobs to run, use :func:`arq.cron.cron` to create them
:param redis_settings: settings for creating a redis connection
:param redis_pool: existing redis pool, generally None
:param burst: whether to stop the worker once all jobs have been run
:param on_startup: coroutine function to run at startup
:param on_shutdown: coroutine function to run at shutdown
:param on_job_start: coroutine function to run on job start
:param on_job_end: coroutine function to run on job end
:param after_job_end: coroutine function to run after job has ended and results have been recorded
:param handle_signals: default true, register signal handlers,
  set to false when running inside other async framework
:param job_completion_wait: time to wait before cancelling tasks after a signal.
  Useful together with ``terminationGracePeriodSeconds`` in kubernetes,
  when you want to make the pod complete jobs before shutting down.
  The worker will not pick new tasks while waiting for shut down.
:param max_jobs: maximum number of jobs to run at a time
:param job_timeout: default job timeout (max run time)
:param keep_result: default duration to keep job results for
:param keep_result_forever: whether to keep results forever
:param poll_delay: duration between polling the queue for new jobs
:param queue_read_limit: the maximum number of jobs to pull from the queue each time it's polled. By default it
                         equals ``max_jobs`` * 5, or 100; whichever is higher.
:param max_tries: default maximum number of times to retry a job
:param health_check_interval: how often to set the health check key
:param health_check_key: redis key under which health check is set
:param ctx: dictionary to hold extra user defined state
:param retry_jobs: whether to retry jobs on Retry or CancelledError or not
:param allow_abort_jobs: whether to abort jobs on a call to :func:`arq.jobs.Job.abort`
:param max_burst_jobs: the maximum number of jobs to process in burst mode (disabled with negative values)
:param job_serializer: a function that serializes Python objects to bytes, defaults to pickle.dumps
:param job_deserializer: a function that deserializes bytes into Python objects, defaults to pickle.loads
:param expires_extra_ms: the default length of time from when a job is expected to start
 after which the job expires, defaults to 1 day in ms.
:param timezone: timezone used for evaluation of cron schedules,
    defaults to system timezone
:param log_results: when set to true (default) results for successful jobs
  will be logged
NFTr   é
   i,  i  ç      à?é   éÿÿÿÿ)Ú
queue_nameÚ	cron_jobsÚredis_settingsÚ
redis_poolÚburstÚ
on_startupÚon_shutdownÚon_job_startÚ
on_job_endÚafter_job_endÚhandle_signalsÚjob_completion_waitÚmax_jobsÚjob_timeoutrL   r=   Ú
poll_delayÚqueue_read_limitr>   Úhealth_check_intervalÚhealth_check_keyÚctxÚ
retry_jobsÚallow_abort_jobsÚmax_burst_jobsÚjob_serializerÚjob_deserializerr"   r   Úlog_resultsÚ	functionsr4   r–   r—   r˜   r™   rš   r›   r3   rœ   r�   rž   rŸ   r    r¡   r¢   r£   r2   rL   r=   r¤   r¥   r>   r¦   r§   r¨   r©   rª   r«   r¬   r­   r"   r   r®   c                óæ  ^ • [        [        U5       V s0 sH  n U R                  U _M     sn T l        Uc  Ub  UR                  nO[        S5      eUT l        / T l        Ubr  [        S U 5       5      (       d  [        S5      e[        U5      T l        T R                  R                  T R                   V!s0 sH  n!U!R                  U!_M     sn!5        [        T R                  5      S:X  a  [        S5      eUT l        UT l        UT l        U	T l        U
T l        UT l        UT l        [(        R*                  " US-   5      T l        ST l        [1        U5      T l        [1        U5      T l        UT l        [1        U5      T l        U=(       d    [;        US-  S5      T l        ST l        UT l         [1        U5      T l!        Uc  T R                  [D        -   T l#        OUT l#        UT l$        T RH                  c  U=(       d
    [K        5       T l&        OS T l&        0 T l'        0 T l(        S T l)         [(        RT                  " 5       T l+        U=(       d    0 T l.        [;        U 4S	 jT R                  R_                  5        5       5      n"U"=(       d    SS
-   T l0        ST l1        ST l2        ST l3        ST l4        S T l5        UT l6        UT l7        T Rl                  (       aº  T Rn                  (       aU  T Rq                  [r        Rt                  T Rv                  5        T Rq                  [r        Rx                  T Rv                  5        OTT Rq                  [r        Rt                  T Rz                  5        T Rq                  [r        Rx                  T Rz                  5        S T l>        UT l?        UT l@        ST lA        […        5       T lC        UT lD        UT lE        UT lF        UT lG        UT lH        Uc3  [’        R”                  " 5       R—                  5       R˜                  T lM        g UT lM        g s  sn f s  sn!f ! [         a>    [(        RX                  " 5       T l+        [(        RZ                  " T RV                  5         GN)f = f)Nz4If queue_name is absent, redis_pool must be present.c              3   ó@   #   • U H  n[        U[        5      v •  M     g 7fr[   )rP   r   )r€   Úcjs     rK   r‚   Ú"Worker.__init__.<locals>.<genexpr>ç   s   é € ÐC¹°2”z "¤g×.Ð.ºùs   ‚z'cron_jobs, must be instances of CronJobr   z4at least one function or cron_job must be registeredr   r”   éd   c              3   ó^   >#   • U H#  oR                   =(       d    TR                  v •  M%     g 7fr[   )r;   Újob_timeout_s)r€   Úfr]   s     €rK   r‚   r³     s#   øé € Ð]ÑE\ÀŸ+™+×;¨×);Ñ);Ô;ÒE\ùs   ƒ*-r’   T)NÚmaprU   r9   r¯   r!   Ú
ValueErrorr–   r—   ÚallrS   r‹   ÚupdateÚlenrš   r›   rœ   r�   rž   rŸ   r¢   ÚasyncioÚBoundedSemaphoreÚsemÚjob_counterr/   r¶   r<   r=   Úpoll_delay_sÚmaxr¥   Ú_queue_read_offsetr>   r¦   r#   r§   Ú_poolr   r˜   ÚtasksÚ	job_tasksÚ	main_taskÚget_event_loopÚloopÚnew_event_loopÚset_event_loopr¨   ÚvaluesÚin_progress_timeout_sÚjobs_completeÚjobs_retriedÚjobs_failedÚ_last_health_checkÚ_last_health_check_logÚ_handle_signalsÚ_job_completion_waitÚ_add_signal_handlerÚsignalÚSIGINTÚhandle_sig_wait_for_completionÚSIGTERMÚ
handle_sigÚon_stopr©   rª   Úallow_pick_jobsÚsetÚaborting_tasksr«   r¬   r­   r"   r®   r   ÚnowÚ
astimezoneÚtzinfor   )#r]   r¯   r–   r—   r˜   r™   rš   r›   rœ   r�   rž   rŸ   r    r¡   r¢   r£   rL   r=   r¤   r¥   r>   r¦   r§   r¨   r©   rª   r«   r¬   r­   r"   r   r®   r·   r²   Úmax_timeouts#   `                                  rK   r^   ÚWorker.__init__»   s¨  ø€ ôF SVÔVZÐ\eÔRfÓ>gÑRfÈQ¸q¿v¹vÀqºyÑRfÑ>gˆŒØÑØÑ%Ø'×:Ñ:‘
ä Ð!WÓXÐXØ$ˆŒØ(*ˆŒØÑ ÜÑC¹ÓC×CÑCÜ"Ð#LÓMÐMÜ! )›_ˆDŒNØ�N‰N×!Ñ!¸¿ºÓ"H¹°2 2§7¡7¨B¢;¹Ñ"HÔIÜˆt�~‰~Ó !Ó#ÜÐUÓVÐVØˆŒ
Ø$ˆŒØ&ˆÔØ(ˆÔØ$ˆŒØ*ˆÔà ˆŒÜ×+Ò+¨H°q©LÓ9ˆŒØ !ˆÔä'¨Ó4ˆÔÜ'¨Ó4ˆÔØ#6ˆÔ Ü& zÓ2ˆÔØ 0× J´C¸À1¹ÀcÓ4JˆÔØ"#ˆÔØ"ˆŒÜ%/Ð0EÓ%FˆÔ"ØÑ#Ø$(§O¡OÔ6MÑ$MˆDÕ!à$4ˆDÔ!ØˆŒ
Ø�:‰:ÑØ;I×;\Ì]Ë_ˆDÕà"&ˆDÔà35ˆŒ
à79ˆŒØ7;ˆŒð	.Ü×.Ò.Ó0ˆDŒIð —9˜"ˆŒÜÔ]ÀTÇ^Á^×EZÑEZÔE\Ó]Ó]ˆØ&1×&6°Q¸"Ñ%<ˆÔ"ØˆÔØˆÔØˆÔØ)*ˆÔØ59ˆÔ#Ø-ˆÔØ$7ˆÔ!Ø××Ø×(×(Ø×(Ñ(¬¯©¸×8[Ñ8[Ô\Ø×(Ñ(¬¯©¸×9\Ñ9\Õ]à×(Ñ(¬¯©¸¿¹ÔHØ×(Ñ(¬¯©¸¿¹ÔIØ<@ˆŒà$ˆŒØ 0ˆÔØ%)ˆÔÜ(+«ˆÔØ,ˆÔØ,ˆÔØ 0ˆÔØ 0ˆÔØ&ˆÔð ?GÑ>NœŸš›×1Ñ1Ó3×:Ñ:ˆ�ÐT\ˆ�ùòg ?hùò #IøôL ó 	.Ü×.Ò.Ó0ˆDŒIÜ×"Ò" 4§9¡9×-ð	.ús   ”PÂ6P#È,P( Ð(AQ0Ñ/Q0rN   c                 óŽ  • U R                   R                  U R                  5       5      U l         U R                   R	                  U R                  5        U R                   R	                  U R                  5       5        g! [
        R                   a     N@f = f! U R                   R	                  U R                  5       5        f = f)zE
Sync function to run the worker, finally closes worker connections.
N)rÉ   Úcreate_taskÚmainrÇ   Úrun_until_completer½   ÚCancelledErrorÚcloserd   s    rK   ÚrunÚ
Worker.run3  sŠ   € ð Ÿ™×.Ñ.¨t¯y©y«{Ó;ˆŒð	7Ø�I‰I×(Ñ(¨¯©Ô8ð
 �I‰I×(Ñ(¨¯©«Õ6øô	 ×%Ñ%ó 	áð	ûð �I‰I×(Ñ(¨¯©«Õ6ús#   °%A? Á?BÂB ÂBÂB Â+Cc              ƒ   ó”   #   • U R                   R                  U R                  5       5      U l        U R                  I Sh  v•N   g N7f)zQ
Asynchronously run the worker, does not close connections. Useful when testing.
N)rÉ   rå   ræ   rÇ   rd   s    rK   Ú	async_runÚWorker.async_run@  s0   é € ð Ÿ™×.Ñ.¨t¯y©y«{Ó;ˆŒØ�n‰n×Óùs   ‚>AÁ AÁAc              ƒ   ó\  #   • Ub  Xl         Ub  X l        U R                  5       I Sh  v•N   U R                  (       aY  U R                  R                  5       I Sh  v•N  Vs/ sH  o3R                  (       a  M  UPM     nn[        U R                  U5      eU R                  $  Nz NIs  snf 7f)z¥
Run :func:`arq.worker.Worker.async_run`, check for failed jobs and raise :class:`arq.worker.FailedJobs`
if any jobs have failed.

:return: number of completed jobs
N)	r©   r«   rí   rÐ   ÚpoolÚall_job_resultsÚsuccessru   rÎ   )r]   r©   r«   r�   Úfailed_job_resultss        rK   Ú	run_checkÚWorker.run_checkG  s’   é € ð Ñ!Ø(ŒOØÑ%Ø"0ÔØ�n‰nÓ×ÐØ××Ø37·9±9×3LÑ3LÓ3N×-NÐ-NÓ!`Ñ-N¨×V_ÕV_§!Ñ-NÐÐ!`Ü˜T×-Ñ-Ð/AÓBÐBà×%Ñ%Ð%ñ 	á-NùÒ!`ùs9   ‚&B,¨B#©2B,ÁB%ÁB,Á"B'Á9B'Á?%B,Â%B,Â'B,c                 ó6   • [        [        U R                  5      $ r[   )r   r   rÄ   rd   s    rK   rð   ÚWorker.poolY  s   € ä”H˜dŸj™jÓ)Ð)rJ   c              ƒ   ó~  #   • U R                   cL  [        U R                  U R                  U R                  U R
                  U R                  S9I S h  v•N U l         [        R                  S[        U R                  5      SR                  U R                  5      5        [        U R                  [        R                  5      I S h  v•N   U R                  U R                  S'   U R                  (       a#  U R                  U R                  5      I S h  v•N   [!        U R"                  5        S h  v•N nU R%                  5       I S h  v•N   U R&                  (       d  M4  SU R(                  s=::  a  U R+                  5       ::  a8  O  O5[,        R.                  " U R0                  R3                  5       6 I S h  v•N     g U R                  R5                  U R
                  5      I S h  v•N nUS:X  d  MÆ  [,        R.                  " U R0                  R3                  5       6 I S h  v•N     g  GNÖ GNe GN Nÿ Né N} NP N
 g 7f)N)r­   r¬   r!   r"   z$Starting worker for %d functions: %sz, Úredisr   )rÄ   r   r˜   r­   r¬   r–   r"   ÚloggerÚinfor¼   r¯   r„   r   rð   r¨   r›   r,   rÁ   Ú_poll_iterationrš   r«   Ú_jobs_startedr½   ÚgatherrÅ   rÌ   Úzcard)r]   Ú_Úqueued_jobss      rK   ræ   ÚWorker.main]  s™  é € Ø�:‰:ÑÜ*Ø×#Ñ#Ø!%×!6Ñ!6Ø#×2Ñ2Ø#'§?¡?Ø!%×!6Ñ!6ñ ÷ ˆDŒJô 	�‰Ð:¼CÀÇÁÓ<OÐQU×QZÑQZÐ[_×[iÑ[iÓQjÔkÜ˜TŸY™Y¬¯©Ó4×4Ð4Ø ŸI™Iˆ�‰�ÑØ�?�?Ø—/‘/ $§(¡(Ó+×+Ð+ä˜D×-Ñ-Ô.÷ 
	 �!Ø×&Ñ&Ó(×(Ð(à�z�z‰zØ˜×+Ñ+ÕC¨t×/AÑ/AÓ/CÖCÜ!Ÿ.š.¨$¯*©*×*;Ñ*;Ó*=Ð>×>Ð>ÙØ$(§I¡I§O¡O°D·O±OÓ$D×D�Ø !Õ#Ü!Ÿ.š.¨$¯*©*×*;Ñ*;Ó*=Ð>×>Ð>Ùò1ò 	5ò ,ñ
	 Ù(ñ ?áDá>ñ /ùs±   ‚AH=ÁH(ÁA3H=ÃH+ÃAH=ÄH.ÄH=Ä-H;Ä1H1Ä2H;Ä5H=Å	H3Å
H=Å!AH=Æ7H5Æ8.H=Ç&H7Ç'H=Ç3.H=È!H9È"H=È+H=È.H=È1H;È3H=È5H=È7H=È9H=È;H=c              ƒ   ó4  #   • U R                   nU R                  (       a?  U R                  S:¼  a/  U R                  U R                  5       -
  nUS:  a  g[	        X!5      nU R
                  (       a~  U R                  U R                  :  ad  [        5       nU R                  R                  U R                  [        S5      U R                  XS9I Sh  v•N nU R                  U5      I Sh  v•N   U R                  (       a  U R!                  5       I Sh  v•N   [#        U R$                  R'                  5       5       H9  u  pVUR)                  5       (       d  M  U R$                  U	 UR+                  5         M;     U R-                  5       I Sh  v•N   g N¿ N¨ N� N7f)zˆ
Get ids of pending jobs from the main queue sorted-set data structure and start those jobs, remove
any finished tasks from self.tasks.
r   r   Nz-inf)ÚminÚstartÚnumrÂ   )r¥   rš   r«   rý   r  rÜ   rÀ   r¢   r-   rð   Úzrangebyscorer–   rF   rÃ   Ú
start_jobsrª   Ú_cancel_aborted_jobsr‹   rÅ   ÚitemsÚdoner   Ú
heart_beat)r]   rw   Úburst_jobs_remainingrß   Újob_idsÚjob_idÚts          rK   rü   ÚWorker._poll_iterationy  sA  é € ð
 ×%Ñ%ˆØ�:�:˜$×-Ñ-°Ó2Ø#'×#6Ñ#6¸×9KÑ9KÓ9MÑ#MÐ Ø# aÓ'ØÜÐ,Ó4ˆEØ××Ø×Ñ $§-¡-Ó/Ü"“n�Ø $§	¡	× 7Ñ 7Ø—O‘O¬¨v«¸d×>UÑ>UÐ[`ð !8ð !÷ �ð —o‘o gÓ.×.Ð.à× × Ø×+Ñ+Ó-×-Ð-ä˜dŸj™j×.Ñ.Ó0Ö1‰IˆFØ�v‰v�x‹xØ—J‘J˜vÐ&à—‘–
ñ	 2ð �o‰oÓ×Ñññ /ñ .ñ 	 ùsN   ‚CFÃFÃFÃ)FÃ*(FÄFÄ?FÅ4FÆ
FÆFÆFÆFÆFc              ƒ   óÐ  #   • U R                   R                  SS9 ISh  v•N nUR                  [        SSS9  UR	                  [        [        5       [        -   [        S5      S9  UR                  5       I Sh  v•N u  p#SSS5      ISh  v•N   [        5       nW HD  nUR                  5       n U R                  U   nUR                  U5        UR                  5         MF     U(       aE  U R                  R!                  U5        U R                   R"                  " [        /UQ76 I Sh  v•N   gg GN Nº Nª! , ISh  v•N  (       d  f       N¿= f! [         a     MÃ  f = f N87f)	zL
Go through job_ids in the abort_jobs_ss sorted set and cancel those tasks.
T©ÚtransactionNr   r•   )r  ÚendÚinf)r  rÂ   )rð   ÚpipelineÚzranger    Úzremrangebyscorer-   r   rF   ÚexecuterÝ   ÚdecoderÆ   ÚaddÚcancelÚKeyErrorrÞ   r»   Úzrem)r]   ÚpipeÚabort_job_idsr   ÚabortedÚjob_id_bytesr  Útasks           rK   r	  ÚWorker._cancel_aborted_jobs˜  s%  é € ð —9‘9×%Ñ%°$Ð%×7Ñ7¸4Ø�K‰Kœ¨Q°BˆKÑ7Ø×!Ñ!¤-´\³^ÔFWÑ5WÔ]bÐchÓ]iÐ!ÑjØ%)§\¡\£^×3ÑˆM÷ 8×7ô
  ›EˆÛ)ˆLØ!×(Ñ(Ó*ˆFðØ—~‘~ fÑ-�ð —‘˜FÔ#Ø—‘–ñ *ö Ø×Ñ×&Ñ& wÔ/Ø—)‘)—.’.¤Ð9°Ò9×9Ñ9ð ò! 8ñ  4÷ 8×7×7Ð7ûô ó Úðúñ :ùsˆ   ‚E& D2¡E&¤AD9Á:D5Á;D9ÂE&ÂD7Â#E&Â1EÃ A+E&Ä+E$Ä,E&Ä5D9Ä7E&Ä9EÄ?EÅ EÅE&Å
E!ÅE&Å E!Å!E&c                 ó`   • U R                   S-
  U l         U R                  R                  5         g )Nr   )rÀ   r¿   Úreleaserd   s    rK   Ú$_release_sem_dec_counter_on_completeÚ+Worker._release_sem_dec_counter_on_complete°  s%   € Ø×+Ñ+¨aÑ/ˆÔØ�‰×ÑÕrJ   r  c           
   ƒ   ó�  ^ #   • U GH/  nT R                   R                  5       I Sh  v•N   T R                  T R                  :¼  a  T R                   R	                  5           gT R                  S-   T l        UR                  5       n[        U-   nT R                  R                  SS9 ISh  v•N nUR                  U5      I Sh  v•N   UR                  U5      I Sh  v•N nUR                  T R                  U5      I Sh  v•N nU(       d  U(       a  U[        5       :”  aX  T R                  S-
  T l        T R                   R	                  5         [        R                  SU5         SSS5      ISh  v•N   GMu  UR!                  5         UR#                  U[%        T R&                  S-  5      S5         UR)                  5       I Sh  v•N   T R*                  R-                  T R/                  U[%        U5      5      5      nUR1                  U 4S j5        UT R2                  U'   SSS5      ISh  v•N   GM2     g GN GN’ GN| GNf GNE NÖ Nƒ! [4        [6        4 aG    T R                  S-
  T l        T R                   R	                  5         [        R                  S	U5         Nf = f Nw! , ISh  v•N  (       d  f       GM½  = f7f)
zX
For each job id, get the job definition, check it's not running and start it in a task
Nr   Tr  z job %s already running elsewherera   ó   1c                 ó$   >• TR                  5       $ r[   )r(  )r   r]   s    €rK   Ú<lambda>Ú#Worker.start_jobs.<locals>.<lambda>Û  s   ø€ °$×2[Ñ2[Ô2]rJ   z2multi-exec error, job %s already started elsewhere)r¿   ÚacquirerÀ   r¢   r'  r  r$   rð   r  ÚwatchÚexistsÚzscorer–   r-   rú   ÚdebugÚmultiÚpsetexrH   rÍ   r  rÉ   rå   Úrun_jobÚadd_done_callbackrÅ   r   r   )	r]   r  Újob_id_br  Úin_progress_keyr   Úongoing_existsÚscorer  s	   `        rK   r  ÚWorker.start_jobs´  s  øé € ô  ˆHØ—(‘(×"Ñ"Ó$×$Ð$à×Ñ 4§=¡=Ó0Ø—‘× Ñ Ô"Ùà#×/Ñ/°!Ñ3ˆDÔà—_‘_Ó&ˆFÜ4°vÑ=ˆOØ—y‘y×)Ñ)°dÐ)×;Ñ;¸tØ—j‘j Ó1×1Ð1Ø'+§{¡{°?Ó'C×!C�Ø"Ÿk™k¨$¯/©/¸6ÓB×B�Þ!®°%¼,».Ó2Hð (,×'7Ñ'7¸!Ñ';�DÔ$Ø—H‘H×$Ñ$Ô&Ü—L‘LÐ!CÀVÔLØ÷ <×;Ò;ð —
‘
”Ø—‘˜O¬S°×1KÑ1KÈdÑ1RÓ-SÐUYÔZð
+ØŸ,™,›.×(Ð(ð Ÿ	™	×-Ñ-¨d¯l©l¸6Ä3ÀuÃ:Ó.NÓO�AØ×'Ñ'Ô(]Ô^Ø)*�D—J‘J˜vÑ&÷3 <×;Ò;ò  Ú$ò <Ú1Ú!CÚBñ <ñ  )øÜ%¤zÐ2ó _à'+×'7Ñ'7¸!Ñ';�DÔ$Ø—H‘H×$Ñ$Ô&Ü—L‘LÐ!UÐW]Ö^ð	_ú÷# <×;×;Ò;üså   ƒ$K§H;¨BKÂ,H>Â-KÂ0J*ÃIÃJ*ÃIÃ#J*ÄIÄA%J*Å(KÅ3I
Å4KÅ;9J*Æ5IÇIÇ	IÇAJ*È%KÈ0J(È1KÈ>KÉJ*ÉJ*ÉJ*É
KÉIÉAJ%Ê"J*Ê$J%Ê%J*Ê(KÊ*K	Ê0J3Ê1K	Ê=	Kr  r;  c              ƒ   óâ  ^ ^^^ ^!^"^#^$#   • [        5       m$T R                  R                  SS9 IS h  v•N nUR                  [        T-   5        UR                  [        T-   5        UR                  [        T-   S5        T R                  (       a3  UR                  [        T5        UR                  5       I S h  v•N u  nm"pVOUR                  5       I S h  v•N u  nm"nSnS S S 5      IS h  v•N   Su  m!m Sm0 m#S[        SS 4UU U!UU"U#U U$4S	 jjnW(       d/  [        R                  S
T5        U" [        S5      5      I S h  v•N $  [!        UT R"                  S9u  m!mm#nm W(       aK  [        5       T -
  S-  n
[        R)                  SU
TT!5        U" [*        R,                  " 5       5      I S h  v•N $  T R.                  T!   n[3        US5      (       a	  T!n[4        nO	T ST! 3nS nU(       a=  UT":”  a7  Um"T R                  R7                  [        T-   S[9        T"5      5      I S h  v•N   UR:                  c  T R:                  OUR:                  nT"U:”  a¨  [        5       T -
  S-  n
[        R                  SX¬U5        T =R<                  S-  sl        [?        T!TT#T"T S[        SU S35      T$[        5       UT R@                  TT RB                  S9n[*        RD                  " T RG                  TU5      5      I S h  v•N $ [H        nS nSnURJ                  c  T RL                  OURJ                  nS nTT"[O        T 5      US.n0 T RP                  EUEnT RR                  (       a  T RS                  U5      I S h  v•N   [        5       m$Sn [U        TT#5      nT"S:”  a  ST" 3OSnT$U-
  S:”  a  UST$U-
  S-  S S 3-  n[        R)                  S!T$T -
  S-  UUU5        T RV                  RY                  URZ                  " U/TQ70 T#D65      =T R\                  T'   n [*        R^                  " UU5      I S h  v•N nUb  T R`                  (       d  SO[c        [e        U5      5      n T R\                  T	  Sn[        5       n[        R)                  S#UT$-
  S-  UU5        SnT =Rl                  S-  sl6        UR‚                  c  T R‚                  OUR‚                  nUR„                  c  T R„                  OUR„                  nS nU[H        La6  U(       d  US%:”  a)  [?        T!TT#T"T UUT$UUT R@                  TT RB                  S9nT R†                  (       a  T R‡                  U5      I S h  v•N   [*        RD                  " T R‰                  TUUUUUU5      5      I S h  v•N   T RŠ                  (       a  T R‹                  U5      I S h  v•N   g g  GN’ GN GNó GNà! , IS h  v•N  (       d  f       GNö= f GN¨! [$         a1  n	[        R'                  ST5        U" U	5      I S h  v•N  s S n	A	$ S n	A	ff = f GN|! [0         a9    [        R                  STT!5        U" [        ST!< S35      5      I S h  v•N  s $ f = f GNN GN~ GN GNM! [f        [*        R,                  4 a*  n	[i        U	S"S 5      n[k        U5      (       a  U" 5       ne S n	A	ff = f! T R\                  T	 f = f! [f        [*        R,                  4 Gaî  n	[        5       nUT$-
  S-  n
T Rn                  (       a”  [q        U	[r        5      (       a  U	Rt                  n[        R)                  S$X¬U	Rt                  =(       d    S%S-  5        U	Rt                  (       a  U	Rt                  [        5       U-
  -   nT =Rv                  S-  sl;         S n	A	GNüTT Rx                  ;   ao  [q        U	[*        R,                  5      (       aP  [        R)                  S&X¬5        U	nSnT Rx                  R{                  T5        T =R<                  S-  sl         S n	A	GN{T Rn                  (       aV  [q        U	[*        R,                  [|        45      (       a1  [        R)                  S'X¬5        T =Rv                  S-  sl;         S n	A	GNâ[        R'                  S(X¬U	R~                  R€                  U	S"U0S)9  U	nSnT =R<                  S-  sl         S n	A	GN.S n	A	ff = f GN† GNV GN/7f)*NTr  iPY F)z	<unknown>r   r?   r…   rN   c              “   ó  >#   • T=R                   S-  sl         [        TTTTTSU T	[        5       T ST 3TR                  TR                  TS9n[
        R                  " TR                  TU5      5      I S h  v•N   g  N7f)Nr   FÚ:)Úfunctionrq   ÚkwargsÚjob_tryÚenqueue_time_msrò   r   Ústart_msÚfinished_msÚrefÚ
serializerr–   r  )rÐ   r   r-   r¬   r–   r½   ÚshieldÚfinish_failed_job)
r…   Úresult_data_rq   rC  Úfunction_namer  rB  rA  r]   rD  s
     €€€€€€€€rK   Ú
job_failedÚ"Worker.run_job.<locals>.job_failedï  s€   øé € Ø×Ò Ñ!ÕÜ+Ø&ØØØØ /ØØØ!Ü(›NØ�h˜a ˜Ð/Ø×.Ñ.ØŸ?™?ØñˆLô —.’. ×!7Ñ!7¸ÀÓ!MÓN×NÓNùs   ƒA5B Á8A>Á9B zjob %s expiredzjob expired)Údeserializerzdeserializing job %s failedra   u%   %6.2fs âŠ˜ %s:%s aborted before startzjob %s, function %r not foundz	function z
 not foundÚnext_runr?  z#%6.2fs ! %s max retries %d exceededr   zmax z retries exceeded)r  rG  )r  rB  Úenqueue_timer;  z try=Ú i°  z	 delayed=rb   Úsu   %6.2fs â†’ %s(%s)%sÚextrau   %6.2fs â†� %s â—� %su$   %6.2fs â†» %s retrying job in %0.2fsr   u   %6.2fs âŠ˜ %s abortedu*   %6.2fs â†» %s cancelled, will be run againz%6.2fs ! %s failed, %s: %s)rS  )Fr-   rð   r  Úgetr%   Úincrr(   Úexpirerª   r  r    r  ÚBaseExceptionrú   Úwarningrm   r   r­   r   Ú	exceptionrû   r½   rè   r¯   r  Úhasattrr&   ÚsetexrD   r>   rÐ   r   r–   r¬   rH  rI  Ú	no_resultr;   r¶   r+   r¨   r�   r)   rÉ   rå   r:   rÆ   Úwait_forr®   r1   rh   Ú	ExceptionÚgetattrÚcallablerÎ   r©   rP   rW   r\   rÏ   rÞ   Úremover�   Ú	__class__r@   r=   r<   rž   Ú
finish_jobrŸ   )%r]   r  r;  r   Úvr   Ú	abort_jobrL  Úenqueue_job_tryÚer  r@  rF  Úkeep_in_progressr>   Úresult_datar   Ú	exc_extraÚfinishr;   Ú
incr_scoreÚjob_ctxr¨   rò   rR  rS  r$  Ú
result_strrE  r=   Úresult_timeout_srq   rC  rK  rB  rA  rD  s%   ``                             @@@@@@rK   r6  ÚWorker.run_jobÞ  s  ÿé € Ü“>ˆØ—9‘9×%Ñ%°$Ð%×7Ñ7¸4Ø�H‰H”^ fÑ,Ô-Ø�I‰IÔ&¨Ñ/Ô0Ø�K‰KÔ(¨6Ñ1°5Ô9Ø×$×$Ø—	‘	œ-¨Ô0Ø15·±³×+?Ñ(��7˜A˜yà&*§l¡l£n× 4‘��7˜AØ!�	÷ 8×7ð *8Ñ&ˆ�Ø "ˆØ!#ˆð	O¤-ð 	O°D÷ 	Oö 	Oö& Ü�N‰NÐ+¨VÔ4Ù#Ô$6°}Ó$EÓF×FÐFð	'ÜL_Ø × 5Ñ 5ñMÑIˆM˜4 ¨¸/ö Ü“ /Ñ1°TÑ9ˆAÜ�K‰KÐ?ÀÀFÈMÔZÙ#¤G×$:Ò$:Ó$<Ó=×=Ð=ð	aØ15·±ÀÑ1NˆHô
 �8˜Z×(Ñ(àˆCÜ0EÑà�H˜A˜m˜_Ð-ˆCØ#Ðæ˜°Ó8Ø%ˆGØ—)‘)—/‘/Ô"2°VÑ";¸UÄCÈÃLÓQ×QÐQà&.×&8Ñ&8Ñ&@�D—N’NÀh×FXÑFXˆ	Ø�YÓÜ“ /Ñ1°TÑ9ˆAÜ�N‰NÐ@À!È)ÔTØ×Ò Ñ!ÕÜ*ØØØØØØÜ" T¨)¨Ð4EÐ#FÓGØÜ“ØØ—‘ØØ×.Ñ.ñˆKô !Ÿš¨×(>Ñ(>¸vÀ{Ó(SÓT×TÐTäˆØˆ	ØˆØ*2×*<Ñ*<Ñ*D�D×&Ò&È(×J\ÑJ\ˆ	Ø$(ˆ
àØÜ*¨?Ó;Øñ	
ˆð &�—‘Ð%˜WÐ%ˆà××Ø×#Ñ# CÓ(×(Ð(ä“>ˆØˆð3	$Ü˜t VÓ,ˆAØ)0°1«�e˜G˜9Ñ%¸"ˆEØ˜5Ñ  DÓ(Ø˜9 h°Ñ&6¸$Ñ%>¸tÐ$DÀAÐFÑF�Ü�K‰KÐ-°¸?Ñ0JÈdÑ/RÐTWÐYZÐ\aÔbØ,0¯I©I×,AÑ,AÀ(×BTÒBTÐUXÐBjÐ[_ÒBjÐciÑBjÓ,kÐkˆD�N‰N˜6Ñ" Tð
+Ü&×/Ò/°°iÓ@×@�ð $*¡>¸×9I×9I™RÌxÔX\Ð]cÓXdÓOe‘
à—N‘N 6Ñ*ð8 ˆGÜ&›.ˆKÜ�K‰KÐ.°¸xÑ1GÈ4Ñ0OÐQTÐV`ÔaØˆFØ×Ò !Ñ#Õð )1×(DÑ(DÑ(LˆD×$Ò$ÐRZ×RnÑRnð 	ð 2:×1GÑ1GÑ1O˜4×-Ò-ÐU]×UkÑUkÐØˆØœÒ"Ö(;Ð?OÐRSÓ?SÜ*ØØØØØØØØØØØ—‘ØØ×.Ñ.ñˆKð  �?�?Ø—/‘/ #Ó&×&Ð&ä�nŠnØ�O‰OØØØØ Ø#ØØ óó

÷ 
	
ð 
	
ð ××Ø×$Ñ$ SÓ)×)Ñ)ð òO 8ò ,@â 4÷ 8×7×7Ò7úòH Gøô "ó 	'Ü×ÑÐ:¸FÔCÙ# A›×&Ð&Õ&ûð	'úò >øô ó 	aÜ�N‰NÐ:¸FÀMÔRÙ#Ô$6¸À=ÑBSÐS]Ð7^Ó$_Ó`×`Ð`Ò`ð	aúò Rò, Uò  )ò AøÜœw×5Ñ5Ð6ó Ü# A w°Ó5�	Ü˜I×&Ñ&Ù )£�IØûð	ûð —N‘N 6Ñ*ûäœ7×1Ñ1Ð2ô 	&Ü&›.ˆKØ˜xÑ'¨4Ñ/ˆAØ��¤:¨a´×#7Ñ#7ØŸ]™]�
Ü—‘ÐBÀAÈQÏ]É]×M_Ð^_ÐcgÑLgÔhØ—=—=Ø!"§¡´,³.À5Ñ2HÑ!I�JØ×!Ò! QÑ&×!Ó!Ø˜4×.Ñ.Ó.´:¸aÄ×AWÑAW×3XÑ3XÜ—‘Ð3°QÔ<Ø�Ø�Ø×#Ñ#×*Ñ*¨6Ô2Ø× Ò  AÑ%× Ó Ø——¤Z°´G×4JÑ4JÌHÐ3U×%VÑ%VÜ—‘ÐHÈ!ÔQØ×!Ò! QÑ&×!Ó!ä× Ñ Ø0°!¸!¿+¹+×:NÑ:NÐPQÐZaÐclÐYmð !ñ ð �Ø�Ø× Ò  AÑ%× Ó ûð1	&úòn 'ò
	
ò *ùsî  Š(c/²W³c/¶BWÂ:WÂ;WÃW
Ã
WÃ"c/Ã-WÃ.Ac/ÅW+Åc/Å	W. Å#Ac/Æ0X,Æ1c/Æ6X/ ÇA"c/È'Y5È(Cc/Ë:Y8Ë;A:c/Í5Y;Í6c/ÎB[ ÐZ Ð1Y>Ð2Z Ð6*[ Ñ![ Ñ/C1c/Õ c&Õ!2c/Öc)Ö)c/Ö=c,Ö>c/×W×
W×c/×W(×W×W(×#	c/×.
X)×8!X$ØXØX$ØX)Øc/Ø$X)Ø)c/Ø/:Y2Ù)Y,Ù*Y2Ù/c/Ù1Y2Ù2c/Ù8c/Ù;c/Ù>Z Ú[Ú%[ Û [Û[ Û[Û[ Ûc#Û5B1cÞ&c/Þ,A9cà%c/à+A!câc/âAcãc/ãc#ã#c/ã)c/ã,c/rk  ri  ro  rl  rh  c              ƒ   ó¶  #   • U R                   R                  SS9 IS h  v•N n/ n	[        U-   n
Uc  Xš/-  n	OUR                  U
[	        U5      5        U(       a{  U(       a,  U(       a  S OUnUR                  [        U-   U[	        U5      S9  U	[        U-   [        U-   /-  n	UR                  [        U5        UR                  U R                  U5        O#U(       a  UR                  U R                  Xa5        U	(       a  UR                  " U	6   UR                  5       I S h  v•N   S S S 5      IS h  v•N   g  GN N N
! , IS h  v•N  (       d  f       g = f7f)NTr  ©Úpx)rð   r  r$   Úpexpirer.   rÝ   r'   r(   r%   r  r    r–   ÚzincrbyÚdeleter  )r]   r  rk  ri  ro  r=   rl  rh  ÚtrÚdelete_keysr9  rV  s               rK   rc  ÚWorker.finish_jobª  s  é € ð —9‘9×%Ñ%°$Ð%×7Ñ7¸2ØˆKÜ4°vÑ=ˆOØÑ'ØÐ0Ñ0‘à—
‘
˜?¬EÐ2BÓ,CÔDæÞÞ%8™TÐ>N�FØ—F‘FÔ,¨vÑ5°{ÄuÈVÃ}�FÑUØÔ 0°6Ñ 9¼>ÈFÑ;RÐSÑS�Ø—‘œ vÔ.Ø—‘˜Ÿ™¨Õ0ÞØ—
‘
˜4Ÿ?™?¨JÔ?ÞØ—	’	˜;Ñ'Ø—*‘*“,×Ð÷' 8×7Ó7ñ& ÷' 8×7×7Ð7üsW   ‚E D8¡E¤C>D?Ä"D;Ä#D?Ä'EÄ2D=Ä3EÄ;D?Ä=EÄ?EÅEÅEÅEc              ƒ   ól  #   • U R                   R                  SS9 IS h  v•N nUR                  [        U-   [        U-   [
        U-   5        UR                  [        U5        UR                  U R                  U5        U R                  =(       d    U R                  S:„  nUbG  U(       a@  U R                  (       a  SOU R                  nUR                  [        U-   U[        U5      S9  UR                  5       I S h  v•N   S S S 5      IS h  v•N   g  Nó N N	! , IS h  v•N  (       d  f       g = f7f)NTr  r   rr  )rð   r  rv  r(   r$   r%   r  r    r–   r=   r<   rÝ   r'   r.   r  )r]   r  ri  rw  rL   rV  s         rK   rI  ÚWorker.finish_failed_jobÉ  sæ   é € Ø—9‘9×%Ñ%°$Ð%×7Ñ7¸2Ø�I‰IÜ  6Ñ)Ü&¨Ñ/Ü Ñ'ôð
 �G‰G”M 6Ô*Ø�G‰G�D—O‘O VÔ,à×2Ñ2×L°d×6HÑ6HÈ1Ñ6LˆKØÑ&®;Ø"×6×6™¸D×<NÑ<N�Ø—‘Ô(¨6Ñ1°;Ä5ÈÃ=�ÑQØ—*‘*“,×Ð÷ 8×7Ò7ñ ÷ 8×7×7Ð7üsW   ‚D4 D¡D4¤CDÃ>DÃ?DÄD4ÄDÄD4ÄDÄD4ÄD1Ä D#Ä!D1Ä-D4c              ƒ   óÞ   #   • [         R                  " U R                  S9nU R                  5       I S h  v•N   [	        U R
                  S5      nU R                  X5      I S h  v•N   g  N4 N7f)N©Útzr“   )r   rß   r   Úrecord_healthrÂ   rÁ   Úrun_cron)r]   rß   Úcron_window_sizes      rK   r  ÚWorker.heart_beatÙ  sX   é € Ü�lŠl˜dŸm™mÑ,ˆØ× Ñ Ó"×"Ð"ä˜t×0Ñ0°#Ó6ÐØ�m‰m˜CÓ2×2Ñ2ñ 	#ñ 	3ùs!   ‚2A-´A)µ.A-Á#A+Á$A-Á+A-ÚnÚdelayÚnum_windowsc              ƒ   ó  #   • [        5       n[        X#-  S9nX-   nU R                   GH5  nUR                  c+  UR                  (       a  Xl        OUR                  U5        M<  UR                  U:  d  MN  UR                  (       a  UR                  nO7UR                  (       a$  UR                   S[        UR                  5       3OS nUR                  U R                  R                  UR                  UU R                  UR                  [        R                  " U R                   S9:”  a  UR                  OS S95        UR                  UR                  5        GM8     U=(       a    ["        R$                  " U6 I S h  v•N   g   g  N7f)N)Úsecondsr?  r}  )Ú_job_idÚ_queue_nameÚ_defer_until)rÝ   r   r—   rO  Úrun_at_startupÚcalculate_nextr  Úuniquer9   r0   r  rð   Úenqueue_jobr–   r   rß   r   r½   rþ   )	r]   rƒ  r„  r…  Újob_futuresÚ
cron_delayÚthis_hb_cutoffÚcron_jobr  s	            rK   r€  ÚWorker.run_cronà  s7  é € Ü“eˆä uÑ':Ñ;ˆ
à™ˆàŸ�ˆHØ× Ñ Ñ(Ø×*×*Ø()Õ%à×+Ñ+¨AÔ.áð × Ñ  >Õ1Ø—?—?Ø,4¯O©O‘FàS[×Sb×Sb §¡˜¨a´
¸8×;LÑ;LÓ0MÐ/NÑOÐhl�FØ—‘Ø—I‘I×)Ñ)Ø Ÿ™Ø &Ø$(§O¡Oà19×1BÑ1BÄXÇ\Â\ÐUY×UbÑUbÑEcÓ1c˜H×-Ò-Ðimð *ð ô	ð ×'Ñ'¨×(9Ñ(9×:ñ5 'ð8 	×:œgŸnšn¨kÐ:×:Ñ:Ñ:Ñ:ùs   ‚A0FÁ6DFÆF	ÆFc              ƒ   ó$  #   • [        5       nXR                  -
  U R                  :  a  g Xl        [        S U R                  R                  5        5       5      nU R                  R                  U R                  5      I S h  v•N n[        R                  " 5       S SU R                   SU R                   SU R                   SU SU 3nU R                  R                  U R                  [!        U R                  S-   S	-  5      UR#                  5       5      I S h  v•N   XDR%                  S
5      S  nU R&                  (       a,  XPR&                  :w  a  [(        R+                  SU5        XPl        g U R&                  (       d  XPl        g g  GN	 Np7f)Nc              3   óH   #   • U H  oR                  5       (       + v •  M     g 7fr[   ©r  ©r€   r  s     rK   r‚   Ú'Worker.record_health.<locals>.<genexpr>
  s   é € ÐFÑ2E¨Q§¡£ŸL™LÒ2Eùó   ‚ "z%b-%d %H:%M:%Sz j_complete=ú
 j_failed=ú j_retried=ú j_ongoing=z queued=r   ra   zj_complete=zrecording health: %s)r
   rÑ   r¦   ÚsumrÅ   rÌ   rð   rÿ   r–   r   rß   rÎ   rÐ   rÏ   r5  r§   rH   ÚencodeÚindexrÒ   rú   rû   )r]   Únow_tsÚpending_tasksÚqueuedrû   Ú
log_suffixs         rK   r  ÚWorker.record_health  s[  é € Ü“ˆØ×,Ñ,Ñ,°×0JÑ0JÓJØØ"(ÔÜÑF°$·*±*×2CÑ2CÔ2EÓFÓFˆØ—y‘y—‘ t§¡Ó7×7ˆä�|Š|‹~˜nÐ-¨\¸$×:LÑ:LÐ9MÈZÐX\×XhÑXhÐWið jØ×*Ñ*Ð+¨;°}°oÀXÈfÈXðWð 	ð �i‰i×ÑØ×!Ñ!¤3¨×(BÑ(BÀQÑ(FÈ$Ñ'NÓ#OÐQU×Q\ÑQ\ÓQ^ó
÷ 	
ð 	
ð Ÿ*™* ]Ó3Ð5Ð6ˆ
Ø×&×&¨:×9TÑ9TÓ+TÜ�K‰KÐ.°Ô5Ø*4Õ'Ø×,×,Ø*4Õ'ð -ò 8ñ
	
ùs&   ‚B FÂFÂBFÄFÄA.FÆFÚsignumÚhandlerc                 óš   •  U R                   R                  U[        X!5      5        g ! [         a    [        R                  S5         g f = f)Nz@Windows does not support adding a signal handler to an eventloop)rÉ   Úadd_signal_handlerr   ÚNotImplementedErrorrú   r3  )r]   r¥  r¦  s      rK   rÕ   ÚWorker._add_signal_handler  s?   € ð	]Ø�I‰I×(Ñ(¨´¸Ó1IÕJøÜ"ó 	]Ü�L‰LÐ[Ö\ð	]ús   ‚%( ¨A
Á	A
c                 óz   • U R                   U R                  -   U R                  -   [        U R                  5      -   $ r[   )rÎ   rÏ   rÐ   r¼   rÅ   rd   s    rK   rý   ÚWorker._jobs_started   s1   € Ø×!Ñ! D×$5Ñ$5Ñ5¸×8HÑ8HÑHÌ3ÈtÏzÉzË?ÑZÐZrJ   c              ƒ   óº   #   • [        U R                  5      (       a;  [        R                  " S5      I Sh  v•N   [        U R                  5      (       a  M:  gg N"7f)zH
Sleeps until all tasks are done. Used together with asyncio.wait_for()
gš™™™™™¹?N)r¼   rÅ   r½   Úsleeprd   s    rK   Ú_sleep_until_tasks_completeÚ"Worker._sleep_until_tasks_complete#  s8   é € ô �$—*‘*�o‰oÜ—-’- Ó$×$Ð$ô �$—*‘*�o�oÙ$ùs   ‚4A¶A·AÁAc              ƒ   ó  #   • [         R                  " [        R                  5         [        R                  " U R                  5       U R                  5      I Sh  v•N   SSS5        [        R                  SUR                  U R                  U R                  U R                  [        S U R                  R                  5        5       5      5        U R                  R                  5        H*  nUR!                  5       (       a  M  UR#                  5         M,     U R$                  =(       a    U R$                  R#                  5         U R&                  =(       a    U R'                  U5        g  g GN! , (       d  f       GN= f7f)z`
Wait for tasks to complete, until `wait_for_job_completion_on_signal_second` has been reached.
Nuh   shutdown on %s, wait complete â—† %d jobs complete â—† %d failed â—† %d retries â—† %d ongoing to cancelc              3   óH   #   • U H  oR                  5       (       + v •  M     g 7fr[   r–  r—  s     rK   r‚   Ú5Worker._wait_for_tasks_to_complete.<locals>.<genexpr>9  s   é € Ð:Ñ&9 —F‘F“H—‘Ò&9ùr™  )Ú
contextlibÚsuppressr½   ÚTimeoutErrorr]  r¯  rÔ   rú   rû   r9   rÎ   rÐ   rÏ   r�  rÅ   rÌ   r  r  rÇ   rÛ   )r]   r¥  r  s      rK   Ú_wait_for_tasks_to_completeÚ"Worker._wait_for_tasks_to_complete*  s	  é € ô × Ò ¤×!5Ñ!5Õ6Ü×"Ò"Ø×0Ñ0Ó2Ø×)Ñ)ó÷ ð ÷ 7ô
 	�‰ØvØ�K‰KØ×ÑØ×ÑØ×ÑÜÑ: d§j¡j×&7Ñ&7Ô&9Ó:Ó:ô	
ð —‘×"Ñ"Ö$ˆAØ—6‘6—8“8Ø—‘–
ñ %ð 	�‰×2˜4Ÿ>™>×0Ñ0Ó2øØ�‰×-˜Ÿ™ fÕ-Ñ-ò!÷ 7Ö6üs6   ‚%F§3E0ÁE-ÁE0ÁB"FÄA(FÅ-E0Å0
E?Å:Fc           
      óL  • [        U5      n[        R                  S5        SU l        [        R                  SUR                  U R
                  U R                  U R                  [        U R                  5      5        U R                  R                  U R                  US95        g)zø
Alternative signal handler that allow tasks to complete within a given time before shutting down the worker.
Time can be configured using `wait_for_job_completion_on_signal_second`.
The worker will stop picking jobs when signal has been received.
z"Setting allow_pick_jobs to `False`FuW   shutdown on %s â—† %d jobs complete â—† %d failed â—† %d retries â—† %d to be completed)r¥  N)r	   rú   rû   rÜ   r9   rÎ   rÐ   rÏ   r¼   rÅ   rÉ   rå   r·  )r]   r¥  Úsigs      rK   rØ   Ú%Worker.handle_sig_wait_for_completionA  s€   € ô �f‹oˆÜ�‰Ð8Ô9Ø$ˆÔÜ�‰ØeØ�H‰HØ×ÑØ×ÑØ×ÑÜ�—
‘
‹Oô	
ð 	�	‰	×Ñ˜d×>Ñ>ÀcÐ>ÐJÕKrJ   c           
      óú  • [        U5      n[        R                  SUR                  U R                  U R
                  U R                  [        U R                  5      5        U R                  R                  5        H*  nUR                  5       (       a  M  UR                  5         M,     U R                  =(       a    U R                  R                  5         U R                  =(       a    U R                  U5        g   g )NuY   shutdown on %s â—† %d jobs complete â—† %d failed â—† %d retries â—† %d ongoing to cancel)r	   rú   rû   r9   rÎ   rÐ   rÏ   r¼   rÅ   rÌ   r  r  rÇ   rÛ   )r]   r¥  rº  r  s       rK   rÚ   ÚWorker.handle_sigT  s¨   € Ü�f‹oˆÜ�‰ØgØ�H‰HØ×ÑØ×ÑØ×ÑÜ�—
‘
‹Oô	
ð —‘×"Ñ"Ö$ˆAØ—6‘6—8“8Ø—‘–
ñ %ð 	�‰×2˜4Ÿ>™>×0Ñ0Ó2øØ�‰×*˜Ÿ™ cÕ*Ñ*rJ   c              ƒ   ó  #   • U R                   (       d  U R                  [        R                  5        U R                  (       d  g [
        R                  " U R                  R                  5       6 I S h  v•N   U R                  R                  U R                  5      I S h  v•N   U R                  (       a#  U R                  U R                  5      I S h  v•N   U R                  R                  SS9I S h  v•N   S U l        g  NŽ Nc N1 N7f)NT©Úclose_connection_pool)rÓ   rÚ   rÖ   ÚSIGUSR1rÄ   r½   rþ   rÅ   rÌ   rð   rv  r§   rœ   r¨   ré   rd   s    rK   ré   ÚWorker.closed  s³   é € Ø×#×#Ø�O‰OœFŸN™NÔ+Ø�z�zØÜ�nŠn˜dŸj™j×/Ñ/Ó1Ð2×2Ð2Ø�i‰i×Ñ˜t×4Ñ4Ó5×5Ð5Ø××Ø×"Ñ" 4§8¡8Ó,×,Ð,Ø�i‰i�o‰o°DˆoÐ9×9Ð9Øˆ�
ñ 	3Ù5á,Ù9ùsH   ‚A1D
Á3DÁ4,D
Â DÂ!3D
ÃDÃ D
Ã5DÃ6D
ÄD
ÄD
ÄD
c                 ó¬   • SU R                    SU R                   SU R                   S[        S U R                  R                  5        5       5       S3	$ )Nz<Worker j_complete=rš  r›  rœ  c              3   óH   #   • U H  oR                  5       (       + v •  M     g 7fr[   r–  r—  s     rK   r‚   Ú"Worker.__repr__.<locals>.<genexpr>s  s   é € ÐGÑ3F¨a§¡£Ÿ\™\Ò3Fùr™  r‰   )rÎ   rÐ   rÏ   r�  rÅ   rÌ   rd   s    rK   re   ÚWorker.__repr__p  s]   € à! $×"4Ñ"4Ð!5°ZÀ×@PÑ@PÐ?QÐQ\Ð]a×]nÑ]nÐ\oð pÜÑG°4·:±:×3DÑ3DÔ3FÓGÓGÐHÈðKð	
rJ   )/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Ç   r«   r¢   r>   rž   r�   rœ   r›   rÛ   rÁ   r–   r¥   r˜   r©   r¿   rÅ   r   )r?   )rN   N©NN)é   )6r@   rA   rB   rC   rk   r!   r"   r   r   r7   r   rD   r   r   r   rG   rH   Údictr   r   r   r   r^   rê   rí   rô   Úpropertyrð   ræ   rü   r	  r(  r‹   Úbytesr  r6  rF   rc  rI  r  r   r€  r  r	   r   rÕ   rý   r¯  r·  rØ   rÚ   ré   re   rI   r?   rJ   rK   r�   r�   �   s+  † ñ+ð^ CEðv]ð %7Ø15Ø26Ø)-ØØ26Ø37Ø48Ø26Ø59Ø#Ø#$ØØ*-Ø*.Ø$)Ø),Ø*.ØØ48Ø*.Ø(,ØØ!&Ø Ø/3Ø37Ø 0Ø'+Ø òCv]à˜E (Ð,=Ð"=Ñ>Ñ?ðv]ð ˜S‘Mð	v]ð
 ˜H WÑ-Ñ.ðv]ð ! Ñ/ðv]ð ˜XÑ&ðv]ð ðv]ð Ð.Ñ/ðv]ð Ð/Ñ0ðv]ð Ð0Ñ1ðv]ð Ð.Ñ/ðv]ð  Ð 1Ñ2ðv]ð ðv]ð !ðv]ð  ð!v]ð" (ð#v]ð$ (ð%v]ð& "ð'v]ð( 'ð)v]ð* # 3™-ð+v]ð, ð-v]ð.  2ð/v]ð0 # 3™-ð1v]ð2 �d˜3 ˜8‘nÑ%ð3v]ð4 ð5v]ð6 ð7v]ð8 ð9v]ð: ! Ñ,ð;v]ð< # <Ñ0ð=v]ð> ð?v]ð@ ˜8Ñ$ðAv]ðB öCv]ôp7ôñ&¨(°4©.ð &ÐQYÐZ]ÑQ^ð &Ðjmõ &ð$ ð*�hó *ó ð*ô ô8 ô>:ô0ð(+¨¨U©ð (+¸ô (+ðTJ* Cð J*°ð J*¸ô J*ðXàðð ðð ˜e‘_ð	ð
 # 5™/ðð "ðð ˜S‘Mðð # 5™/ðð 
ôð>¨cð ÀÈÁð ÐTXô ô 3ñ#; ð #;°ð #;ÀSð #;ÐQUõ #;ôJ5ð*]¨'ð ]¸HÀgÀYÐPTÀ_Ñ<Uð ]ÐZ^ô ]ð[˜sô [ô%ð.¸ð .ÀDô .ð.L°Wð LÀô Lð&+ ð +¨Tô +ô 
ð
˜#÷ 
rJ   r�   Úsettings_clsr5   c                 ó   • [        [        R                  " [        5      R                  R                  5       5      n[        U [        5      (       a  U OU R                  nUR                  5        VVs0 sH  u  p4X1;   d  M  X4_M     snn$ s  snnf r[   )
rÝ   rQ   Ú	signaturer�   Ú
parametersÚkeysrP   rÉ  Ú__dict__r
  )rÌ  Úworker_argsÚdÚkrd  s        rK   Ú
get_kwargsrÕ  w  sh   € Ü”g×'Ò'¬Ó/×:Ñ:×?Ñ?ÓAÓB€KÜ" <´×6Ñ6‰¸L×<QÑ<Q€AØŸW™WœYÔ;™Y‘T�Q¨!Ñ*:‹DˆAŠD™YÒ;Ð;ùÓ;s   Á2
B
Â B
rA  c                 ó2   • [        S0 0 [        U 5      EUED6$ )Nr?   )r�   rÕ  )rÌ  rA  s     rK   Úcreate_workerr×  }  s    € ÜÑ;Ð:”z ,Ó/Ð:°6Ð:Ñ;Ð;rJ   c                 ó>   • [        U 40 UD6nUR                  5         U$ r[   )r×  rê   )rÌ  rA  Úworkers      rK   Ú
run_workerrÚ  �  s   € Ü˜<Ñ2¨6Ñ2€FØ
‡J�J„LØ€MrJ   r˜   r§   r–   c              ƒ   óv  #   • U =(       d
    [        5       n [        U 5      I S h  v•N nU=(       d    [        nU=(       d	    U[        -   nUR	                  U5      I S h  v•N nU(       d  [
        R                  S5        SnO[
        R                  SU5        SnUR                  SS9I S h  v•N   U$  NŽ NV N
7f)Nz9Health check failed: no health check sentinel value foundr   zHealth check successful: %sr   Tr¿  )	r   r   r!   r#   rT  rú   rX  rû   ré   )r˜   r§   r–   rù   Údatar�   s         rK   Úasync_check_healthrÝ  ‡  sŸ   é € ð $×6¤}£€NÜ'¨Ó7×7€EØ×1Ô1€JØ'×Q¨JÔ9PÑ,PÐà—‘Ð+Ó,×,€DÞÜ�‰ÐRÔSØ‰ä�‰Ð1°4Ô8ØˆØ
�+‰+¨Dˆ+Ð
1×1Ð1Ø€Hñ 8ñ -ñ 2ùs4   ‚"B9¤B3¥9B9ÁB5ÁAB9Â,B7Â-B9Â5B9Â7B9c                 ó<  • [        U 5      n[        [        [           UR	                  S5      5      n[        [        [
           UR	                  S5      5      n[        [        [
           UR	                  S5      5      n[        R                  " [        X#U5      5      $ )zk
Run a health check on the worker and return the appropriate exit code.
:return: 0 if successful, 1 if not
r˜   r§   r–   )	rÕ  r   r   r   rT  rD   r½   rê   rÝ  )rÌ  Ú
cls_kwargsr˜   r§   r–   s        rK   Úcheck_healthrà  š  st   € ô
 ˜LÓ)€JÜœ(¤=Ñ1°:·>±>ÐBRÓ3SÓT€NÜœH¤S™M¨:¯>©>Ð:LÓ+MÓNÐÜ”hœs‘m Z§^¡^°LÓ%AÓB€JÜ�;Š;Ô)¨.ÈJÓWÓXÐXrJ   rÇ  )Wr½   r´  rQ   ÚloggingrÖ   Úcollections.abcr   Údataclassesr   r   r   r   Ú	functoolsr   r	   r
   Útypingr   r   r   r   r   r   Úredis.exceptionsr   r   Úarq.cronr   Úarq.jobsr   r   r   r   r   r   Úconnectionsr   r   r   r   Ú	constantsr   r    r!   r"   r#   r$   r%   r&   r'   r(   Úutilsr)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   Ú	getLoggerrú   Úobjectr\  r7   rD   rG   rH   rU   rS   rW   rm   ru   r�   r�   rÉ  Ú	NameErrorrÕ  r×  rÚ  rÝ  rà  r?   rJ   rK   Ú<module>rï     s  ðÛ Û Û Û Û Ý $Ý !ß 2Ñ 2Ý Ý Ý ß F× Fç 6å ß s× sç MÓ M÷÷ ÷ ÷
÷ 
õ 
ö ß^Ó^à	×	Ò	˜<Ó	(€Ù‹H€	ð ÷ð ó ðð Ø04Ø,0Ø*.Ø#ò!wØ�S˜(Ð$5Ð5Ñ6ð!wð �3‰-ð!wð Ð,Ñ-ð	!wð
 Ð(Ñ)ð!wð " $™ð!wð ˜‰}ð!wð õ!wôHˆLô ô"˜ô ô �ô  ô 	ˆ|ô 	÷g
ñ g
ðT<Ð1ð <°d¸3À	¸>Ñ6Jô <ð<Ð 4ð <Àð <Èô <ðÐ1ð ¸Sð ÀVô ð rvñØ˜]Ñ+ðØ?GÈ¹}ðØaiÐjmÑanðàõð&	YÐ3ð 	Y¸õ 	YrJ   