ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+//.383,7(-.+



-%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ               ÿÄ J  	     ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ              ÿÄ *        !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú
"SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5
ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍÑ¶¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e
ríV
..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+//.383,7(-.+



-%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ               ÿÄ J  	     ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ              ÿÄ *        !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú
"SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5
ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍÑ¶¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e
ríV
..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     3

  \e                 @   s8  d dgZ ddlZddlZ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
mZ dZdZdZej Zdd	 Zd
d ZG dd deZG dd dZdd ZG dd deZdf ddfddZdd ZG dd  d eZG dd deZeZG dd deZG dd deZG d d! d!eZ G d"d deZ!dS )#Pool
ThreadPool    N   )util)get_contextTimeoutError   c             C   s   t t|  S )N)listmap)args r   ,/usr/lib64/python3.6/multiprocessing/pool.pymapstar+   s    r   c             C   s   t tj| d | d S )Nr   r   )r	   	itertoolsstarmap)r   r   r   r   starmapstar.   s    r   c               @   s   e Zd Zdd Zdd ZdS )RemoteTracebackc             C   s
   || _ d S )N)tb)selfr   r   r   r   __init__6   s    zRemoteTraceback.__init__c             C   s   | j S )N)r   )r   r   r   r   __str__8   s    zRemoteTraceback.__str__N)__name__
__module____qualname__r   r   r   r   r   r   r   5   s   r   c               @   s   e Zd Zdd Zdd ZdS )ExceptionWithTracebackc             C   s0   t jt|||}dj|}|| _d| | _d S )N z

"""
%s""")	tracebackformat_exceptiontypejoinexcr   )r   r    r   r   r   r   r   <   s    
zExceptionWithTraceback.__init__c             C   s   t | j| jffS )N)rebuild_excr    r   )r   r   r   r   
__reduce__A   s    z!ExceptionWithTraceback.__reduce__N)r   r   r   r   r"   r   r   r   r   r   ;   s   r   c             C   s   t || _| S )N)r   	__cause__)r    r   r   r   r   r!   D   s    
r!   c                   s0   e Zd ZdZ fddZdd Zdd Z  ZS )MaybeEncodingErrorzVWraps possible unpickleable errors, so they can be
    safely sent through the socket.c                s.   t || _t || _tt| j| j| j d S )N)reprr    valuesuperr$   r   )r   r    r&   )	__class__r   r   r   P   s    

zMaybeEncodingError.__init__c             C   s   d| j | jf S )Nz(Error sending result: '%s'. Reason: '%s')r&   r    )r   r   r   r   r   U   s    zMaybeEncodingError.__str__c             C   s   d| j j| f S )Nz<%s: %s>)r(   r   )r   r   r   r   __repr__Y   s    zMaybeEncodingError.__repr__)r   r   r   __doc__r   r   r)   __classcell__r   r   )r(   r   r$   L   s   r$   Fc          '   C   s  |j }| j}t| dr*| jj  |jj  |d k	r:||  d}xH|d ksX|oT||k ry
| }	W n$ ttfk
r   tj	d P Y nX |	d krtj	d P |	\}
}}}}yd|||f}W nB t
k
r } z&|r|tk	rt||j}d|f}W Y d d }~X nX y||
||f W nR t
k
rd } z4t||d }tj	d|  ||
|d|ff W Y d d }~X nX d  }	 }
 } } }}|d7 }qBW tj	d	|  d S )
N_writerr   z)worker got EOFError or OSError -- exitingzworker got sentinel -- exitingTFr   z0Possible encoding error while sending result: %szworker exiting after %d tasks)putgethasattrr,   close_readerEOFErrorOSErrorr   debug	Exception_helper_reraises_exceptionr   __traceback__r$   )inqueueoutqueueinitializerinitargsZmaxtasksZwrap_exceptionr-   r.   Z	completedtaskjobifuncr   kwdsresultewrappedr   r   r   worker]   sD    





$rD   c             C   s   | dS )z@Pickle-able helper function for use by _guarded_task_generation.Nr   )Zexr   r   r   r6      s    r6   c               @   s6  e Zd ZdZdZdd Zddf ddfddZdd	 Zd
d Zdd Z	dd Z
f i fddZd=ddZd>ddZd?ddZdd Zd@ddZdAddZf i ddfdd ZdBd!d"ZdCd#d$Zed%d& Zed'd( Zed)d* Zed+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zed5d6 Zed7d8 Z d9d: Z!d;d< Z"dS )Dr   zS
    Class which supports an async version of applying functions to arguments.
    Tc             O   s   | j j||S )N)_ctxProcess)r   r   r@   r   r   r   rF      s    zPool.ProcessNc             C   sn  |pt  | _| j  tj | _i | _t| _|| _	|| _
|| _|d krPtj pNd}|dk r`td|d k	rzt| rztd|| _g | _| j  tjtj| fd| _d| j_t| j_| jj  tjtj| j| j| j| j| jfd| _d| j_t| j_| jj  tjtj| j| j | jfd| _!d| j!_t| j!_| j!j  t"j#| | j$| j| j%| j| j| j| j| j!| jfdd| _&d S )Nr   z&Number of processes must be at least 1zinitializer must be a callable)targetr   T   )r   Zexitpriority)'r   rE   _setup_queuesqueueQueue
_taskqueue_cacheRUN_state_maxtasksperchild_initializer	_initargsos	cpu_count
ValueErrorcallable	TypeError
_processes_pool_repopulate_pool	threadingZThreadr   _handle_workers_worker_handlerdaemonstart_handle_tasks
_quick_put	_outqueue_task_handler_handle_results
_quick_get_result_handlerr   ZFinalize_terminate_pool_inqueue
_terminate)r   	processesr:   r;   Zmaxtasksperchildcontextr   r   r   r      sT    




zPool.__init__c             C   sZ   d}xPt tt| jD ]:}| j| }|jdk	rtjd|  |j  d}| j|= qW |S )zCleanup after any worker processes which have exited due to reaching
        their specified lifetime.  Returns True if any workers were cleaned up.
        FNzcleaning up worker %dT)reversedrangelenrY   exitcoder   r4   r   )r   Zcleanedr>   rD   r   r   r   _join_exited_workers   s    

zPool._join_exited_workersc          	   C   s|   xvt | jt| j D ]^}| jt| j| j| j| j	| j
| jfd}| jj| |jjdd|_d|_|j  tjd qW dS )zBring the number of pool processes up to the specified number,
        for use after reaping workers which have exited.
        )rG   r   rF   Z
PoolWorkerTzadded workerN)rm   rX   rn   rY   rF   rD   rh   rb   rQ   rR   rP   _wrap_exceptionappendnamereplacer^   r_   r   r4   )r   r>   wr   r   r   rZ      s    zPool._repopulate_poolc             C   s   | j  r| j  dS )zEClean up any exited workers and start replacements for them.
        N)rp   rZ   )r   r   r   r   _maintain_pool   s    zPool._maintain_poolc             C   s4   | j j | _| j j | _| jjj| _| jjj| _	d S )N)
rE   ZSimpleQueuerh   rb   r,   sendra   r1   recvre   )r   r   r   r   rI      s    zPool._setup_queuesc             C   s   | j |||j S )z6
        Equivalent of `func(*args, **kwds)`.
        )apply_asyncr.   )r   r?   r   r@   r   r   r   apply   s    z
Pool.applyc             C   s   | j ||t|j S )zx
        Apply `func` to each element in `iterable`, collecting the results
        in a list that is returned.
        )
_map_asyncr   r.   )r   r?   iterable	chunksizer   r   r   r
     s    zPool.mapc             C   s   | j ||t|j S )z
        Like `map()` method but the elements of the `iterable` are expected to
        be iterables as well and will be unpacked as arguments. Hence
        `func` and (a, b) becomes func(a, b).
        )r{   r   r.   )r   r?   r|   r}   r   r   r   r     s    zPool.starmapc             C   s   | j ||t|||S )z=
        Asynchronous version of `starmap()` method.
        )r{   r   )r   r?   r|   r}   callbackerror_callbackr   r   r   starmap_async  s    zPool.starmap_asyncc             c   sn   y0d}x&t |D ]\}}||||fi fV  qW W n8 tk
rh } z||d t|fi fV  W Y dd}~X nX dS )zProvides a generator of tasks for imap and imap_unordered with
        appropriate handling for iterables which throw exceptions during
        iteration.r   N)	enumerater5   r6   )r   Z
result_jobr?   r|   r>   xrB   r   r   r   _guarded_task_generation  s    zPool._guarded_task_generationr   c             C   s   | j tkrtd|dkrFt| j}| jj| j|j|||j	f |S t
j|||}t| j}| jj| j|jt||j	f dd |D S dS )zP
        Equivalent of `map()` -- can be MUCH slower than `Pool.map()`.
        zPool not runningr   c             s   s   | ]}|D ]
}|V  q
qd S )Nr   ).0chunkitemr   r   r   	<genexpr>@  s    zPool.imap.<locals>.<genexpr>N)rO   rN   rU   IMapIteratorrM   rL   r-   r   _job_set_lengthr   
_get_tasksr   )r   r?   r|   r}   rA   task_batchesr   r   r   imap'  s     




z	Pool.imapc             C   s   | j tkrtd|dkrFt| j}| jj| j|j|||j	f |S t
j|||}t| j}| jj| j|jt||j	f dd |D S dS )zL
        Like `imap()` method but ordering of results is arbitrary.
        zPool not runningr   c             s   s   | ]}|D ]
}|V  q
qd S )Nr   )r   r   r   r   r   r   r   [  s    z&Pool.imap_unordered.<locals>.<genexpr>N)rO   rN   rU   IMapUnorderedIteratorrM   rL   r-   r   r   r   r   r   r   )r   r?   r|   r}   rA   r   r   r   r   imap_unorderedB  s     




zPool.imap_unorderedc             C   sB   | j tkrtdt| j||}| jj|jd|||fgdf |S )z;
        Asynchronous version of `apply()` method.
        zPool not runningr   N)rO   rN   rU   ApplyResultrM   rL   r-   r   )r   r?   r   r@   r~   r   rA   r   r   r   ry   ]  s
    
zPool.apply_asyncc             C   s   | j ||t|||S )z9
        Asynchronous version of `map()` method.
        )r{   r   )r   r?   r|   r}   r~   r   r   r   r   	map_asynch  s    zPool.map_asyncc       
      C   s   | j tkrtdt|ds$t|}|dkrTtt|t| jd \}}|rT|d7 }t|dkrdd}tj	|||}t
| j|t|||d}	| jj| j|	j||df |	S )zY
        Helper function to implement map, starmap and their async counterparts.
        zPool not running__len__N   r   r   )r   )rO   rN   rU   r/   r	   divmodrn   rY   r   r   	MapResultrM   rL   r-   r   r   )
r   r?   r|   Zmapperr}   r~   r   Zextrar   rA   r   r   r   r{   p  s&    

zPool._map_asyncc             C   sT   t j }x0|jtks$| jr8|jtkr8| j  tjd q
W | j	j
d  tjd d S )Ng?zworker handler exiting)r[   current_threadrO   rN   rM   	TERMINATErv   timesleeprL   r-   r   r4   )poolthreadr   r   r   r\     s    zPool._handle_workersc             C   sj  t j }xt| jd D ]\}}d }zx|D ]}|jr@tjd P y|| W q* tk
r }	 zD|d d \}
}y||
 j|d|	f W n t	k
r   Y nX W Y d d }	~	X q*X q*W |rtjd |r|d nd}||d  wP W d d  } }}
X qW tjd y:tjd |j
d  tjd x|D ]}|d  q&W W n  tk
rZ   tjd	 Y nX tjd
 d S )Nz'task handler found thread._state != RUNr   Fzdoing set_length()r   ztask handler got sentinelz/task handler sending sentinel to result handlerz(task handler sending sentinel to workersz/task handler got OSError when sending sentinelsztask handler exitingr   )r[   r   iterr.   rO   r   r4   r5   _setKeyErrorr-   r3   )	taskqueuer-   r9   r   cacher   ZtaskseqZ
set_lengthr<   rB   r=   idxpr   r   r   r`     sB    







zPool._handle_tasksc             C   s  t j }xy
| }W n" ttfk
r6   tjd d S X |jrJtjd P |d kr^tjd P |\}}}y|| j|| W n tk
r   Y nX d  } }}q
W x|o|jt	kr:y
| }W n" ttfk
r   tjd d S X |d krtjd q|\}}}y|| j|| W n tk
r*   Y nX d  } }}qW t
| drtjd y,x&tdD ]}| jj spP |  q^W W n ttfk
r   Y nX tjdt||j d S )	Nz.result handler got EOFError/OSError -- exitingz,result handler found thread._state=TERMINATEzresult handler got sentinelz&result handler ignoring extra sentinelr1   z"ensuring that outqueue is not full
   z7result handler exiting: len(cache)=%s, thread._state=%s)r[   r   r3   r2   r   r4   rO   r   r   r   r/   rm   r1   pollrn   )r9   r.   r   r   r<   r=   r>   objr   r   r   rd     sZ    









zPool._handle_resultsc             c   s4   t |}x&ttj||}|s"d S | |fV  q
W d S )N)r   tupler   islice)r?   itsizer   r   r   r   r     s    zPool._get_tasksc             C   s   t dd S )Nz:pool objects cannot be passed between processes or pickled)NotImplementedError)r   r   r   r   r"     s    zPool.__reduce__c             C   s&   t jd | jtkr"t| _t| j_d S )Nzclosing pool)r   r4   rO   rN   CLOSEr]   )r   r   r   r   r0     s    

z
Pool.closec             C   s$   t jd t| _t| j_| j  d S )Nzterminating pool)r   r4   r   rO   r]   ri   )r   r   r   r   	terminate  s    
zPool.terminatec             C   sD   t jd | jj  | jj  | jj  x| jD ]}|j  q0W d S )Nzjoining pool)r   r4   r]   r   rc   rf   rY   )r   r   r   r   r   r     s    



z	Pool.joinc             C   sD   t jd | jj  x*|j r>| jj r>| jj  tj	d qW d S )Nz7removing tasks from inqueue until task handler finishedr   )
r   r4   Z_rlockacquireis_aliver1   r   rx   r   r   )r8   task_handlerr   r   r   r   _help_stuff_finish(  s
    


zPool._help_stuff_finishc	       
      C   s(  t jd t|_t|_t jd | j||t| t|_|jd  t jd tj |k	r`|j	  |rt
|d drt jd x|D ]}	|	jd kr|	j  qW t jd tj |k	r|j	  t jd tj |k	r|j	  |ot
|d dr$t jd	 x,|D ]$}	|	j rt jd
|	j  |	j	  qW d S )Nzfinalizing poolz&helping task handler/workers to finishzjoining worker handlerr   r   zterminating workerszjoining task handlerzjoining result handlerzjoining pool workerszcleaning up worker %d)r   r4   r   rO   r   rn   r-   r[   r   r   r/   ro   r   r   pid)
clsr   r8   r9   r   Zworker_handlerr   Zresult_handlerr   r   r   r   r   rg   1  s6    










zPool._terminate_poolc             C   s   | S )Nr   )r   r   r   r   	__enter___  s    zPool.__enter__c             C   s   | j   d S )N)r   )r   exc_typeZexc_valZexc_tbr   r   r   __exit__b  s    zPool.__exit__)N)N)NNN)r   )r   )NNN)NNN)#r   r   r   r*   rq   rF   r   rp   rZ   rv   rI   rz   r
   r   r   r   r   r   ry   r   r{   staticmethodr\   r`   rd   r   r"   r0   r   r   r   classmethodrg   r   r   r   r   r   r   r      sF   8

 



 
 
.<			.c               @   s@   e Zd Zdd Zdd Zdd Zddd	Zdd
dZdd ZdS )r   c             C   s4   t j | _tt| _|| _|| _|| _| || j< d S )N)	r[   ZEvent_eventnextjob_counterr   rM   	_callback_error_callback)r   r   r~   r   r   r   r   r   k  s    

zApplyResult.__init__c             C   s
   | j j S )N)r   Zis_set)r   r   r   r   readys  s    zApplyResult.readyc             C   s   | j S )N)_success)r   r   r   r   
successfulv  s    zApplyResult.successfulNc             C   s   | j j| d S )N)r   wait)r   timeoutr   r   r   r   z  s    zApplyResult.waitc             C   s,   | j | | j st| jr"| jS | jd S )N)r   r   r   r   _value)r   r   r   r   r   r.   }  s    
zApplyResult.getc             C   sV   |\| _ | _| jr$| j r$| j| j | jr>| j  r>| j| j | jj  | j| j= d S )N)r   r   r   r   r   setrM   r   )r   r>   r   r   r   r   r     s    
zApplyResult._set)N)N)	r   r   r   r   r   r   r   r.   r   r   r   r   r   r   i  s   

	r   c               @   s   e Zd Zdd Zdd ZdS )r   c             C   sf   t j| |||d d| _d g| | _|| _|dkrLd| _| jj  || j= n|| t	||  | _d S )N)r   Tr   )
r   r   r   r   
_chunksize_number_leftr   r   r   bool)r   r   r}   lengthr~   r   r   r   r   r     s    


zMapResult.__init__c             C   s   |  j d8  _ |\}}|rp| jrp|| j|| j |d | j < | j dkr| jrZ| j| j | j| j= | jj  nH| r| jrd| _|| _| j dkr| j	r| j	| j | j| j= | jj  d S )Nr   r   F)
r   r   r   r   r   rM   r   r   r   r   )r   r>   Zsuccess_resultsuccessrA   r   r   r   r     s"    




zMapResult._setN)r   r   r   r   r   r   r   r   r   r     s   r   c               @   s:   e Zd Zdd Zdd ZdddZeZdd	 Zd
d ZdS )r   c             C   sJ   t jt j | _tt| _|| _tj	 | _
d| _d | _i | _| || j< d S )Nr   )r[   Z	ConditionZLock_condr   r   r   rM   collectionsdeque_items_index_length	_unsorted)r   r   r   r   r   r     s    

zIMapIterator.__init__c             C   s   | S )Nr   )r   r   r   r   __iter__  s    zIMapIterator.__iter__Nc             C   s   | j ~ y| jj }W nh tk
r~   | j| jkr6t| j j| y| jj }W n( tk
rx   | j| jkrpttY nX Y nX W d Q R X |\}}|r|S |d S )N)	r   r   popleft
IndexErrorr   r   StopIterationr   r   )r   r   r   r   r&   r   r   r   r     s"    zIMapIterator.nextc          
   C   s   | j  | j|krr| jj| |  jd7  _x8| j| jkrd| jj| j}| jj| |  jd7  _q.W | j j  n
|| j|< | j| jkr| j| j	= W d Q R X d S )Nr   )
r   r   r   rr   r   popnotifyr   rM   r   )r   r>   r   r   r   r   r     s    

zIMapIterator._setc          	   C   s<   | j , || _| j| jkr.| j j  | j| j= W d Q R X d S )N)r   r   r   r   rM   r   )r   r   r   r   r   r     s
    
zIMapIterator._set_length)N)	r   r   r   r   r   r   __next__r   r   r   r   r   r   r     s   

r   c               @   s   e Zd Zdd ZdS )r   c          
   C   sP   | j @ | jj| |  jd7  _| j j  | j| jkrB| j| j= W d Q R X d S )Nr   )r   r   rr   r   r   r   rM   r   )r   r>   r   r   r   r   r      s    
zIMapUnorderedIterator._setN)r   r   r   r   r   r   r   r   r     s   r   c               @   s@   e Zd ZdZedd Zddf fddZdd Zed	d
 ZdS )r   Fc              O   s   ddl m} || |S )Nr   )rF   )ZdummyrF   )r   r@   rF   r   r   r   rF     s    zThreadPool.ProcessNc             C   s   t j| ||| d S )N)r   r   )r   rj   r:   r;   r   r   r   r     s    zThreadPool.__init__c             C   s,   t j | _t j | _| jj| _| jj| _d S )N)rJ   rK   rh   rb   r-   ra   r.   re   )r   r   r   r   rI     s    


zThreadPool._setup_queuesc          
   C   s<   | j , | jj  | jjd g|  | j j  W d Q R X d S )N)Z	not_emptyrJ   clearextendZ
notify_all)r8   r   r   r   r   r   r     s    
zThreadPool._help_stuff_finish)	r   r   r   rq   r   rF   r   rI   r   r   r   r   r   r     s
   )"__all__r[   rJ   r   r   rS   r   r   r   r   r   r   rN   r   r   countr   r   r   r5   r   r   r!   r$   rD   r6   objectr   r   ZAsyncResultr   r   r   r   r   r   r   r   <module>
   s@   	*   \&)@