o
    l¨Êh{"  ã                   @   sÀ   d dl Z d dl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mZ d dl
mZ dd	lmZmZ dd
lmZmZ g d¢ZG dd„ deƒZG dd„ deƒZdS )é    N)Úutil)Ú
connection)ÚSEM_VALUE_MAX)ÚFull)Ú	_sentinelÚQueue)ÚSimpleQueueé   )ÚloadsÚdumps)Úassert_spawningÚget_context)r   r   r   c                       sp   e Zd Zd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Zedd„ ƒZdd„ Z	e
jdd… dk r4‡ fdd„Z‡  ZS ‡  ZS )r   r   Nc                    sÄ   t jd d… dkrtƒ j||d� nK|dkrt}|d u rtƒ }|| _tjdd�\| _	| _
| ¡ | _t ¡ | _t jdkr?d | _n| ¡ | _| |¡| _d| _|  ¡  t jdkr]t | tj¡ || _d S )Né   ©é   é   )ÚmaxsizeÚctxr   F©ÚduplexÚwin32)ÚsysÚversion_infoÚsuperÚ__init__r   r   Ú_maxsizer   ÚPipeÚ_readerÚ_writerÚLockÚ_rlockÚosÚgetpidÚ_opidÚplatformÚ_wlockÚBoundedSemaphoreÚ_semÚ_ignore_epipeÚ_after_forkr   Úregister_after_forkr   Ú	_reducers)Úselfr   Úreducersr   ©Ú	__class__© úV/var/www/html/env/lib/python3.10/site-packages/joblib/externals/loky/backend/queues.pyr   "   s&   





zQueue.__init__c              	   C   s0   t | ƒ | j| j| j| j| j| j| j| j| j	f	S ©N)
r   r(   r   r   r   r+   r    r%   r'   r#   ©r,   r0   r0   r1   Ú__getstate__A   s
   þzQueue.__getstate__c              
   C   s4   |\	| _ | _| _| _| _| _| _| _| _|  	¡  d S r2   )
r(   r   r   r   r+   r    r%   r'   r#   r)   ©r,   Ústater0   r0   r1   Ú__setstate__G   s
   þzQueue.__setstate__c                 C   sÐ   t  d¡ | j ¡  tjtj| j| j| j	| j
| jj| j| j| j| jf	dd�| _d| j_t  d¡ | j ¡  t  d¡ | jt ¡ k}| jsW|sWt j| jtjt | j¡gdd�| _t j| tj| j| jgd	d�| _d S )
NzQueue._start_thread()ÚQueueFeederThread)ÚtargetÚargsÚnameTzdoing self._thread.start()z... done self._thread.start()éûÿÿÿ)Úexitpriorityé
   )r   ÚdebugÚ_bufferÚclearÚ	threadingÚThreadr   Ú_feedÚ	_notemptyÚ_send_bytesr%   r   Úcloser+   r(   Ú_on_queue_feeder_errorr'   Ú_threadÚdaemonÚstartr#   r!   r"   Ú_joincancelledÚFinalizeÚ_finalize_joinÚweakrefÚrefÚ_jointhreadÚ_finalize_closeÚ_close)r,   Úcreated_by_this_processr0   r0   r1   Ú_start_threadN   s4   

þû



ý
ýzQueue._start_threadc	              
   C   sn  t  d¡ |j}	|j}
|j}| j}t}tjdkr|j}|j}nd }	 zU|	ƒ  z
| s,|ƒ  W |
ƒ  n|
ƒ  w z7	 |ƒ }||u rJt  d¡ |ƒ  W W d S t	||d�}|d u rY||ƒ n|ƒ  z	||ƒ W |ƒ  n|ƒ  w ~~q7 t
yu   Y nw W n> tyµ } z2|r‘t|ddƒtjkr‘W Y d }~d S t  ¡ r¢t  d|¡ W Y d }~d S | ¡  |||ƒ W Y d }~nd }~ww q")	Nz$starting thread to feed data to piper   r	   z%feeder thread got sentinel -- exiting©r-   Úerrnor   zerror in queue thread: %s)r   r?   ÚacquireÚreleaseÚwaitÚpopleftr   r   r$   r   Ú
IndexErrorÚBaseExceptionÚgetattrrW   ÚEPIPEÚ
is_exitingÚinfo)ÚbufferÚnotemptyÚ
send_bytesÚ	writelockrG   r-   Úignore_epipeÚonerrorÚ	queue_semÚnacquireÚnreleaseÚnwaitÚbpopleftÚsentinelÚwacquireÚwreleaseÚobjÚobj_Úer0   r0   r1   rD   v   sb   

€


îÿ€ôâzQueue._feedc                 C   s   ddl }| ¡  dS )z˜
        Private API hook called when feeding data in the background thread
        raises an exception.  For overriding by concurrent.futures.
        r   N)Ú	tracebackÚ	print_exc)r,   rr   rp   rs   r0   r0   r1   rH   ±   s   zQueue._on_queue_feeder_errorr   r   c                    s   t t| ƒ ¡  | jj| _d S r2   )r   r   r)   r   rd   rF   r3   r.   r0   r1   r)   »   s   zQueue._after_fork)r   NN)Ú__name__Ú
__module__Ú__qualname__r   r4   r7   rU   ÚstaticmethodrD   rH   r   r   r)   Ú__classcell__r0   r0   r.   r1   r       s    (
:þr   c                       sP   e Zd Zd‡ fdd„	Zdd„ Zdd„ Zejdd… d	k r d
d„ Zdd„ Z	‡  Z
S )r   Nc                    s~   t jd d… dkrtƒ j|d� n)|d u rtƒ }tjdd�\| _| _| 	¡ | _
| jj| _t jdkr5d | _n| 	¡ | _|| _d S )Nr   r   )r   Fr   r   )r   r   r   r   r   r   r   r   r   r   r    ÚpollÚ_pollr$   r%   r+   )r,   r-   r   r.   r0   r1   r   Â   s   




zSimpleQueue.__init__c                 C   s    t | ƒ | j| j| j| j| jfS r2   )r   r   r   r+   r    r%   r3   r0   r0   r1   r4   Õ   s   ÿzSimpleQueue.__getstate__c                 C   s   |\| _ | _| _| _| _d S r2   )r   r   r+   r    r%   r5   r0   r0   r1   r7   Ú   s   ÿzSimpleQueue.__setstate__r   r   c                 C   s>   | j � | j ¡ }W d   ƒ t|ƒS 1 sw   Y  t|ƒS r2   )r    r   Ú
recv_bytesr
   )r,   Úresr0   r0   r1   Úgetá   s   
ÿýzSimpleQueue.getc                 C   s`   t || jd�}| jd u r| j |¡ d S | j� | j |¡ W d   ƒ d S 1 s)w   Y  d S )NrV   )r   r+   r%   r   rd   )r,   rp   r0   r0   r1   Úputè   s   
"ÿzSimpleQueue.put)NN)ru   rv   rw   r   r4   r7   r   r   r~   r   ry   r0   r0   r.   r1   r   À   s    r   )r!   r   rW   rO   rB   Úmultiprocessingr   r   Úmultiprocessing.synchronizer   Úmultiprocessing.queuesr   r   r   Úmp_Queuer   Úmp_SimpleQueueÚ	reductionr
   r   Úcontextr   r   Ú__all__r0   r0   r0   r1   Ú<module>   s"    !