o
    ݉f                     @   s`   d dl Z d dlZd dlZd dlZG dd dZe Zdd Zdd Zdd	 Zd
d Z	dd Z
dS )    Nc                   @   s   e Zd ZdS )_worker_StateN)__name__
__module____qualname__ r   r   L/home/ubuntu/flask/venv/lib/python3.10/site-packages/pymupdf/_apply_pages.pyr      s    r   c                 C   s>   | t _|t _|t _|t _|t _d t _|r||i | d S d S N)_worker_statepathpagefnpagefn_argspagefn_kwargsstatsdocument)r
   initfninitfn_argsinitfn_kwargsr   r   r   r   r   r   r   _worker_init   s   r   c              	   C   s@   t   |  } | dkrtdt d| dd| d d S d S )Ng?os.getpid()=z: 2fzs: .)timepymupdflogosgetpid)tlabelr   r   r   _stats_write%   s   (r   c                 C   s   t jst jr
t }tt jt _t jrt|d t jr t }t j|  }t jr-t|d t jr4t }t j|gt j	R i t j
}t jrJt|d |S )Nzpymupdf.Document()z#_worker_state.document[page_number]z_worker_state.pagefn())r	   r   r   r   r   Documentr
   r   r   r   r   )page_numberr   pageretr   r   r   
_worker_fn+   s.   



r#   c
                 C   sV   t |t| |||||||	f}
|
t|}| W  d    S 1 s$w   Y  d S r   )multiprocessingPoolr   	map_asyncr#   get)r
   pagesr   r   r   r   r   r   concurrencyr   poolresultr   r   r   _multiprocessingG   s   	$r,   c
                    s  d
|d u r
t  }t  t   	
fdd}
d }t }z*	r/t }t|D ]W}t }|dkrz4z|
  W n ty] } zt	
dt d|  d }~ww W 
rlt	
dt d td n
rt	
dt d td w || q3	rt|d 	rt }
rt	
d tt|D ]}| q	rt|d	 d gt| }tt|D ].} \}}
rt	
d
|dt| || d u sJ t|tr|s|} n|||< qt|D ]}d  q
rt	
d   |r|
rt	
dt| |W 	r#t }|D ]#}
r3t	
d|d t|d}
rGt	
d|d| q%	rRt|d S S 	rZt }|D ]#}
rjt	
d|d t|d}
r~t	
d|d| q\	rt|d w w )Nr   c               
      s  d } 
rt dt d d t 	 	 
r-t dt d  }
rAt dt d|d |d u rGd S zT| s\	rPt }t } 	r\t|d 	rbt }| | }	rmt|d	 
r|t dt d
t	 	rt }|gt	j
R i t	j}	rt|d|d W n# ty } z
rt dt d| |}W Y d }~nd }~ww 
rt dt d|d| ||f q )Nr   z	: initfn=z initfn_args=   z: calling get().z: page_num=r   zpymupdf.Document(path)zdocument[page_num]z: _worker_state=	page_num=z	 pagefn()z: exception e=z: sending page_num=z ret=)r   r   r   r   r   r'   r   r   r   r	   r   r   	Exceptionput)r   page_numr   r!   r"   er   r   r   r   r   r   r
   
queue_downqueue_upr   verboser   r   childfn{   sp    



 z_fork.<locals>.childfnr   z: childfn() => e=z: calling os._exit(0)zcreate child processeszSending page numbers.zSend page numbersr.   z len(text)=zClosing queues.z%After concurrent, returning len(ret)=zwaiting for pid=r   zpid=z => e=zJoin all child proceses)r$   	cpu_countQueuelistr   ranger   forkr/   r   r   r   _exitappendr   lenr0   r'   
isinstanceclosewaitpid)r
   r(   r   r   r   r   r   r   r)   r   r7   errorpidsr   ipr2   r1   r"   textpidr   r3   r   _forkb   s   	 8





rI   )r$   r   r   r   r   r	   r   r   r#   r,   rI   r   r   r   r   <module>   s    