£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<html>
B
     fh                 @   s0  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 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$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   9/opt/alt/python37/lib64/python3.7/multiprocessing/pool.pymapstar+   s    r   c             C   s   t t| 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 t|||}d|}|| _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 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$   r   Fc          
   C   s  |d k	r(t |tr|dks(td||j}| j}t| drR| j  |j	  |d k	rb||  d}xP|d ks|r||k ry
| }	W n$ t
tfk
r   td P Y nX |	d krtd P |	\}
}}}}yd|||f}W nH tk
r. } z(|r|tk	rt||j}d|f}W d d }~X Y nX y||
||f W nR tk
r } z2t||d }td	|  ||
|d|ff W d d }~X Y nX d  }	 }
 } } }}|d7 }qjW td
|  d S )Nr   zMaxtasks {!r} is not valid_writerr   z)worker got EOFError or OSError -- exitingzworker got sentinel -- exitingTFz0Possible encoding error while sending result: %szworker exiting after %d tasks)
isinstanceintAssertionErrorformatputgethasattrr,   close_readerEOFErrorOSErrorr   debug	Exception_helper_reraises_exceptionr   __traceback__r$   )inqueueoutqueueinitializerinitargsZmaxtasksZwrap_exceptionr1   r2   Z	completedtaskjobifuncr   kwdsresultewrappedr   r   r   worker]   sJ    





$rH   c             C   s   | dS )z@Pickle-able helper function for use by _guarded_task_generation.Nr   )Zexr   r   r   r:      s    r:   c               @   s,  e Zd ZdZdZdd Zd>ddZd	d
 Zdd Zdd Z	dd Z
di fddZd?ddZd@ddZdAddZdd ZdBddZdCddZdi ddfd d!ZdDd"d#ZdEd$d%Zed&d' Zed(d) Zed*d+ Zed,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zed6d7 Zed8d9 Z d:d; Z!d<d= Z"dS )Fr   zS
    Class which supports an async version of applying functions to arguments.
    Tc             O   s   | j j||S )N)_ctxProcess)r   r   rD   r   r   r   rJ      s    zPool.ProcessNr   c             C   sl  |pt  | _|   t | _i | _t| _|| _	|| _
|| _|d krPt pNd}|dk r`td|d k	rxt|sxtd|| _g | _|   tjtj| fd| _d| j_t| j_| j  tjtj| j| j| j| j| jfd| _d| j_t| j_| j  tjtj| j| j | jfd| _!d| j!_t| 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   rI   _setup_queuesqueueSimpleQueue
_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d|  |  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lenr]   exitcoder   r8   r   )r   ZcleanedrB   rH   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dd|_d|_|  td qW dS )zBring the number of pool processes up to the specified number,
        for use after reaping workers which have exited.
        )rK   r   rJ   Z
PoolWorkerTzadded workerN)rq   r\   rr   r]   rJ   rH   rl   rf   rU   rV   rT   _wrap_exceptionappendnamereplacerb   rc   r   r8   )r   rB   wr   r   r   r^      s    zPool._repopulate_poolc             C   s   |   r|   dS )zEClean up any exited workers and start replacements for them.
        N)rt   r^   )r   r   r   r   _maintain_pool   s    zPool._maintain_poolc             C   s4   | j  | _| j  | _| jjj| _| jjj| _	d S )N)
rI   rO   rl   rf   r,   sendre   r5   recvri   )r   r   r   r   rM      s    zPool._setup_queuesc             C   s   |  ||| S )zT
        Equivalent of `func(*args, **kwds)`.
        Pool must be running.
        )apply_asyncr2   )r   rC   r   rD   r   r   r   apply   s    z
Pool.applyc             C   s   |  ||t| S )zx
        Apply `func` to each element in `iterable`, collecting the results
        in a list that is returned.
        )
_map_asyncr   r2   )r   rC   iterable	chunksizer   r   r   r
     s    zPool.mapc             C   s   |  ||t| 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   r2   )r   rC   r   r   r   r   r   r     s    zPool.starmapc             C   s   |  ||t|||S )z=
        Asynchronous version of `starmap()` method.
        )r   r   )r   rC   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 dd}~X Y 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)	enumerater9   r:   )r   Z
result_jobrC   r   rB   xrF   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	f |S |dk r\td
|t|||}t| 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   zChunksize must be 1+, not {0:n}c             s   s   | ]}|D ]
}|V  q
qd S )Nr   ).0chunkitemr   r   r   	<genexpr>E  s    zPool.imap.<locals>.<genexpr>N)rS   rR   rY   IMapIteratorrQ   rP   r1   r   _job_set_lengthr0   r   
_get_tasksr   )r   rC   r   r   rE   task_batchesr   r   r   imap)  s(    




z	Pool.imapc             C   s   | j tkrtd|dkrFt| j}| j| |j|||j	f |S |dk r\td
|t|||}t| 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   zChunksize must be 1+, not {0!r}c             s   s   | ]}|D ]
}|V  q
qd S )Nr   )r   r   r   r   r   r   r   b  s    z&Pool.imap_unordered.<locals>.<genexpr>N)rS   rR   rY   IMapUnorderedIteratorrQ   rP   r1   r   r   r   r0   r   r   r   )r   rC   r   r   rE   r   r   r   r   imap_unorderedG  s&    




zPool.imap_unorderedc             C   sB   | j tkrtdt| j||}| j|jd|||fgdf |S )z;
        Asynchronous version of `apply()` method.
        zPool not runningr   N)rS   rR   rY   ApplyResultrQ   rP   r1   r   )r   rC   r   rD   r   r   rE   r   r   r   r}   d  s
    
zPool.apply_asyncc             C   s   |  ||t|||S )z9
        Asynchronous version of `map()` method.
        )r   r   )r   rC   r   r   r   r   r   r   r   	map_asynco  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	|||}t
| j|t|||d}	| 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   )rS   rR   rY   r3   r	   divmodrr   r]   r   r   	MapResultrQ   rP   r1   r   r   )
r   rC   r   Zmapperr   r   r   Zextrar   rE   r   r   r   r   w  s&    

zPool._map_asyncc             C   sT   t  }x0|jtks$| jr8|jtkr8|   td q
W | j	
d  td d S )Ng?zworker handler exiting)r_   current_threadrS   rR   rQ   	TERMINATErz   timesleeprP   r1   r   r8   )poolthreadr   r   r   r`     s    zPool._handle_workersc             C   sj  t  }xt| jd D ]\}}d }zx|D ]}|jr@td P y|| W q* tk
r }	 zB|d d \}
}y||
 |d|	f W n t	k
r   Y nX W d d }	~	X Y q*X q*W |rtd |r|d nd}||d  wP W d d  } }}
X qW td y:td |
d  td	 x|D ]}|d  q&W W n  tk
rZ   td
 Y nX td d S )Nz'task handler found thread._state != RUNr   Fzdoing set_length()r   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 exiting)r_   r   iterr2   rS   r   r8   r9   _setKeyErrorr1   r7   )	taskqueuer1   r=   r   cacher   ZtaskseqZ
set_lengthr@   rF   rA   idxpr   r   r   rd     sB    







zPool._handle_tasksc          	   C   s  t  }xy
| }W n" ttfk
r6   td d S X |jr\|jtksPtdtd P |d krptd P |\}}}y|| 	|| W n t
k
r   Y nX d  } }}q
W x|rP|jtkrPy
| }W n" ttfk
r   td d S X |d krtd q|\}}}y|| 	|| W n t
k
r@   Y nX d  } }}qW t| drtd y,x&tdD ]}| j sP |  qtW W n ttfk
r   Y nX td	t||j d S )
Nz.result handler got EOFError/OSError -- exitingzThread not in TERMINATEz,result handler found thread._state=TERMINATEzresult handler got sentinelz&result handler ignoring extra sentinelr5   z"ensuring that outqueue is not full
   z7result handler exiting: len(cache)=%s, thread._state=%s)r_   r   r7   r6   r   r8   rS   r   r/   r   r   r3   rq   r5   pollrr   )r=   r2   r   r   r@   rA   rB   objr   r   r   rh     s\    










zPool._handle_resultsc             c   s4   t |}x&tt||}|s"d S | |fV  q
W d S )N)r   tupler   islice)rC   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 d | jtkr"t| _t| j_d S )Nzclosing pool)r   r8   rS   rR   CLOSEra   )r   r   r   r   r4     s    

z
Pool.closec             C   s$   t d t| _t| j_|   d S )Nzterminating pool)r   r8   r   rS   ra   rm   )r   r   r   r   	terminate   s    
zPool.terminatec             C   sn   t d | jtkrtdn| jttfkr4td| j  | j	  | j
  x| jD ]}|  qZW d S )Nzjoining poolzPool is still runningzIn unknown state)r   r8   rS   rR   rY   r   r   ra   r   rg   rj   r]   )r   r   r   r   r   r   &  s    





z	Pool.joinc             C   sD   t d | j  x*| r>| j r>| j  t	d qW d S )Nz7removing tasks from inqueue until task handler finishedr   )
r   r8   Z_rlockacquireis_aliver5   r   r|   r   r   )r<   task_handlerr   r   r   r   _help_stuff_finish2  s
    


zPool._help_stuff_finishc	       
      C   sJ  t d t|_t|_t d | ||t| | sNt|dkrNtdt|_|d  t d t	
 |k	r||  |rt|d drt d x|D ]}	|	jd kr|	  qW t d t	
 |k	r|  t d	 t	
 |k	r|  |rFt|d drFt d
 x0|D ](}	|	 rt d|	j  |	  qW d S )Nzfinalizing poolz&helping task handler/workers to finishr   z.Cannot have cache with result_hander not alivezjoining worker handlerr   zterminating workerszjoining task handlerzjoining result handlerzjoining pool workerszcleaning up worker %d)r   r8   r   rS   r   rr   r   r/   r1   r_   r   r   r3   rs   r   pid)
clsr   r<   r=   r   Zworker_handlerr   Zresult_handlerr   r   r   r   r   rk   ;  s<    











zPool._terminate_poolc             C   s   | S )Nr   )r   r   r   r   	__enter__k  s    zPool.__enter__c             C   s   |    d S )N)r   )r   exc_typeZexc_valZexc_tbr   r   r   __exit__n  s    zPool.__exit__)NNr   NN)N)N)NNN)r   )r   )NNN)NNN)#r   r   r   r*   ru   rJ   r   rt   r^   rz   rM   r~   r
   r   r   r   r   r   r}   r   r   staticmethodr`   rd   rh   r   r"   r4   r   r   r   classmethodrk   r   r   r   r   r   r   r      sF    
8

 



 
 
.<		0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  | _tt| _|| _|| _|| _| || j< d S )N)	r_   ZEvent_eventnextjob_counterr   rQ   	_callback_error_callback)r   r   r   r   r   r   r   r   w  s    

zApplyResult.__init__c             C   s
   | j  S )N)r   Zis_set)r   r   r   r   ready  s    zApplyResult.readyc             C   s   |   std| | jS )Nz{0!r} not ready)r   rY   r0   _success)r   r   r   r   
successful  s    zApplyResult.successfulNc             C   s   | j | d S )N)r   wait)r   timeoutr   r   r   r     s    zApplyResult.waitc             C   s,   |  | |  st| jr"| jS | jd S )N)r   r   r   r   _value)r   r   r   r   r   r2     s    
zApplyResult.getc             C   sT   |\| _ | _| jr$| j r$| | j | jr<| j s<| | j | j  | j| j= d S )N)r   r   r   r   r   setrQ   r   )r   rB   r   r   r   r   r     s    
zApplyResult._set)N)N)	r   r   r   r   r   r   r   r2   r   r   r   r   r   r   u  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= 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  nF|s| jrd| _|| _| j dkr| j	r| 	| j | j| j= | j  d S )Nr   r   F)
r   r   r   r   r   rQ   r   r   r   r   )r   rB   Zsuccess_resultsuccessrE   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 t  | _tt| _|| _t	 | _
d| _d | _i | _| || j< d S )Nr   )r_   Z	ConditionZLock_condr   r   r   rQ   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 }W nn tk
r   | j| jkr8td | j | y| j }W n, tk
r~   | j| jkrttd td 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d7  _x8| j| jkrd| j| j}| j| |  jd7  _q.W | j   n
|| j|< | j| jkr| j| j	= W d Q R X d S )Nr   )
r   r   r   rv   r   popnotifyr   rQ   r   )r   rB   r   r   r   r   r     s    

zIMapIterator._setc          	   C   s<   | j , || _| j| jkr.| j   | j| j= W d Q R X d S )N)r   r   r   r   rQ   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d7  _| j   | j| jkrB| j| j= W d Q R X d S )Nr   )r   r   rv   r   r   r   rQ   r   )r   rB   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dZdd	 Zed
d ZdS )r   Fc              O   s   ddl m} || |S )Nr   )rJ   )ZdummyrJ   )r   rD   rJ   r   r   r   rJ     s    zThreadPool.ProcessNr   c             C   s   t | ||| d S )N)r   r   )r   rn   r>   r?   r   r   r   r   !  s    zThreadPool.__init__c             C   s,   t  | _t  | _| jj| _| jj| _d S )N)rN   rO   rl   rf   r1   re   r2   ri   )r   r   r   r   rM   $  s    


zThreadPool._setup_queuesc             C   sN   yx| j dd qW W n tjk
r,   Y nX xt|D ]}| d  q8W d S )NF)block)r2   rN   ZEmptyrq   r1   )r<   r   r   rB   r   r   r   r   *  s    zThreadPool._help_stuff_finish)NNr   )	r   r   r   ru   r   rJ   r   rM   r   r   r   r   r   r     s
   
)Nr   NF)"__all__r_   rN   r   r   rW   r   r   r   r   r   r   rR   r   r   countr   r   r   r9   r   r   r!   r$   rH   r:   objectr   r   ZAsyncResultr   r   r   r   r   r   r   r   <module>
   s@   	 
,   f')@