3

T'íc‹ã@sÜdZddlZddlZddlZddlmZddlmZmZm	Z	m
Z
mZmZyddl
Z
Wnek
rldZ
YnXddlmZddlmZejeƒZe
oœejdkZGdd	„d	ƒZGd
d„dƒZdeeeee
ed
œdd„ZdS)zParallel building utilities.éN)Úsqrt)ÚAnyÚCallableÚDictÚListÚOptionalÚSequence)ÚSphinxParallelError)ÚloggingÚposixc@sFeZdZdZd
eddœdd„Zdeeeddœdd	„Zdd
œdd„Z	dS)ÚSerialTaskszEHas the same interface as ParallelTasks, but executes tasks directly.éN)ÚnprocÚreturncCsdS)N©)Úselfrrrú6/tmp/pip-build-gk9425m9/sphinx/sphinx/util/parallel.pyÚ__init__szSerialTasks.__init__)Ú	task_funcÚargÚresult_funcrcCs(|dk	r||ƒ}n|ƒ}|r$||ƒdS)Nr)rrrrÚresrrrÚadd_tasks

zSerialTasks.add_task)rcCsdS)Nr)rrrrÚjoin&szSerialTasks.join)r
)NN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úintrrrrrrrrrrsrc@steZdZdZeddœdd„Zeeeddœdd„Zdeeedd	œd
d„Z	ddœd
d„Z
ddœdd„Zedœdd„Z
dS)Ú
ParallelTasksz1Executes *nproc* tasks in parallel after forking.N)rrcCs4||_i|_i|_i|_i|_i|_d|_d|_dS)Nr)rÚ
_result_funcsÚ_argsÚ_procsÚ_precvsÚ_precvsWaitingÚ	_pworkingÚ_taskid)rrrrrr-szParallelTasks.__init__)ÚpipeÚfuncrrc	Cs¨y<tjƒ}|jƒ|dkr$|ƒ}n||ƒ}WdQRXd}WnHtk
r„}z,d}tj|j|ƒdjƒ}|tjƒf}WYdd}~XnXtj	|j
ƒ|j||j
|fƒdS)NFTr)r
ZLogCollectorZcollectÚ
BaseExceptionÚ	tracebackÚformat_exception_onlyÚ	__class__ÚstripÚ
format_excZconvert_serializableÚlogsÚsend)	rr'r(rZ	collectorÚretÚfailedÚerrÚerrmsgrrrÚ_process>s
zParallelTasks._process)rrrrc	Cs~|j}|jd7_|pdd„|j|<||j|<tjdƒ\}}tjdƒ}|j|j|||fd}||j|<||j	|<|j
ƒdS)Nr
cSsdS)Nr)rÚresultrrrÚ<lambda>Qsz(ParallelTasks.add_task.<locals>.<lambda>FÚfork)ÚtargetÚargs)r&r r!ÚmultiprocessingZPipeZget_contextÚProcessr5r"r$Ú	_join_one)	rrrrÚtidZprecvZpsendÚcontextÚprocrrrrNs



zParallelTasks.add_task)rcCsFy"x|jr|jƒstjdƒqWWntk
r@|jƒ‚YnXdS)Ng{®Gáz”?)r%r=ÚtimeÚsleepÚ	ExceptionÚ	terminate)rrrrrZszParallelTasks.joincCsXxRt|jƒD]D}|j|jƒ|jj|ƒ|jj|ƒ|jj|ƒ|jd8_qWdS)Nr
)Úlistr#r"rDr Úpopr%)rr>rrrrDdszParallelTasks.terminatec
Csîd}x˜|jjƒD]Š\}}|jƒr|jƒ\}}}|r:t|Ž‚x|D]}tj|ƒq@W|jj|ƒ|j	j|ƒ|ƒ|j
|jƒ|jj|ƒ|jd8_d}PqWxJ|j
rè|j|jkrè|j
jƒ\}}	|	|j|<|j
|jƒ|jd7_q W|S)NFr
T)r#ÚitemsÚpollÚrecvr	ÚloggerÚhandler rFr!r"rr%r$rÚpopitemÚstart)
rZ
joined_anyr>r'Úexcr/r6ÚlogZnewtidZnewprecvrrrr=ls(

zParallelTasks._join_one)NN)rrrrrrrrr5rrrDÚboolr=rrrrr*s
ré
)Ú	argumentsrÚmaxbatchrcsjtˆƒ}||‰ˆ|kr,tt|||ƒƒ‰ˆdkr8d‰t|ˆƒ\}}|rR|d7}‡‡fdd„t|ƒDƒS)Nrr
cs$g|]}ˆ|ˆ|dˆ…‘qS)r
r)Ú.0Úi)rRÚ	chunksizerrú
<listcomp>’szmake_chunks.<locals>.<listcomp>)ÚlenrrÚdivmodÚrange)rRrrSÚnargsZnchunksÚrestr)rRrVrÚmake_chunks…sr])rQ)rÚosrAr*ÚmathrÚtypingrrrrrrr;ÚImportErrorZ
sphinx.errorsr	Zsphinx.utilr
Ú	getLoggerrrJÚnameZparallel_availablerrÚstrrr]rrrrÚ<module>s  

[