o $a @sdZddlZddlZddlZddlZddlZddlmZddlm Z m Z m Z m Z m Z mZzddlZWn ey=dZYnwddlmZddlmZeeZeoaejdkoaejdko`ed k ZGd d d ZGd d d Zddeededede e fddZ dS)z sphinx.util.parallel ~~~~~~~~~~~~~~~~~~~~ Parallel building utilities. :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. N)sqrt)AnyCallableDictListOptionalSequence)SphinxParallelError)loggingposix)Darwinc @sJeZdZdZddeddfddZdded ed eddfd d Zdd dZ dS) SerialTaskszEHas the same interface as ParallelTasks, but executes tasks directly.nprocreturnNcCdSNselfrrr6/usr/lib/python3/dist-packages/sphinx/util/parallel.py__init__*zSerialTasks.__init__ task_funcarg result_funccCs,|dur ||}n|}|r||dSdSrr)rrrrresrrradd_task-s   zSerialTasks.add_taskcCrrrrrrrjoin5rzSerialTasks.joinrNNrN) __name__ __module__ __qualname____doc__intrrrrr!rrrrr's rc @szeZdZdZdeddfddZdeded eddfd d Zdd ed ed eddfddZ dddZ dddZ de fddZ dS) ParallelTasksz1Executes *nproc* tasks in parallel after forking.rrNcCs4||_i|_i|_i|_i|_i|_d|_d|_dS)Nr)r _result_funcs_args_procs_precvs_precvsWaiting _pworking_taskidrrrrr<s zParallelTasks.__init__pipefuncrc Csz(t}||dur|}n||}Wdn1s wYd}Wn%tyM}zd}t|j|d}|tf}WYd}~nd}~wwt |j | ||j |fdS)NFTr) r LogCollectorcollect BaseException tracebackformat_exception_only __class__strip format_excconvert_serializablelogssend) rr2r3r collectorretfailederrerrmsgrrr_processMs"  zParallelTasks._processrrcCst|j}|jd7_|pdd|j|<||j|<td\}}tj|j|||fd}||j|<||j|<| dS)NrcSrrr)rresultrrr`sz(ParallelTasks.add_task..F)targetargs) r1r+r,multiprocessingPipeProcessrDr-r/ _join_one)rrrrtidprecvpsendprocrrrr]s    zParallelTasks.add_taskcCsDz|jr|s td|jsWdSWdSty!|w)Ng{Gz?)r0rLtimesleep Exception terminater rrrr!is  zParallelTasks.joincCsTt|jD]"}|j||j||j||j||jd8_qdS)Nr)listr.r-rTr+popr0)rrMrrrrTss   zParallelTasks.terminatec Csd}|jD]D\}}|rK|\}}}|rt||D]}t|q|j||j |||j | |j||j d8_ d}nq|j rx|j |jkrx|j \}} | |j|<|j ||j d7_ |j rx|j |jksU|S)NFrT)r.itemspollrecvr loggerhandler+rVr,r-r!r0r/rpopitemstart) r joined_anyrMr2excr=rElognewtidnewprecvrrrrL{s,    zParallelTasks._join_oner#r$)r%r&r'r(r)rrrrDrr!rTboolrLrrrrr*9s r* argumentsrmaxbatchrcsjt}|||krtt|||dkrdt|\}}|r)|d7}fddt|DS)Nrrcs$g|]}||dqSr"r).0ire chunksizerr s$zmake_chunks..)lenr)rdivmodrange)rerrfnargsnchunksrestrrir make_chunkssrr)rd)!r(osplatformsysrQr7mathrtypingrrrrrrrI ImportError sphinx.errorsr sphinx.utilr getLoggerr%rZname version_infosystemparallel_availablerr*strr)rrrrrrs0        ([