U Ä:âe~Nã@shdZddlZddlZddlZddlZddlZddlZddlmZm Z m Z m Z m Z m Z mZmZmZmZmZmZmZee e eeeehƒZzeWnek r¤iZYnXdd„ZGdd„deƒZeeefZdd „Zd d „Z d d „Z!dd„Z"d&dd„Z#d'dd„Z$e$Z%d(dd„Z&Gdd„dƒZ'Gdd„de'ƒZ(dd„Z)d)dd „Z*ej+d!krdGd"d#„d#ƒZ,Gd$d%„d%e'ƒZ-dS)*a Basic infrastructure for asynchronous socket service clients and servers. There are only two ways to have a program on a single processor do "more than one thing at a time". Multi-threaded programming is the simplest and most popular way to do it, but there is another very different technique, that lets you have nearly all the advantages of multi-threading, without actually using multiple threads. it's really only practical if your program is largely I/O bound. If your program is CPU bound, then pre-emptive scheduled threads are probably what you really need. Network servers are rarely CPU-bound, however. If your operating system supports the select() system call in its I/O library (and nearly all do), then you can use it to juggle multiple communication channels at once; doing other work while your I/O is taking place in the "background." Although this strategy can seem strange and complex, especially at first, it is in many ways easier to understand and control than multi-threaded programming. The module documented here solves many of the difficult problems for you, making the task of building sophisticated high-performance network servers and clients a snap. éN) ÚEALREADYÚ EINPROGRESSÚ EWOULDBLOCKÚ ECONNRESETÚEINVALÚENOTCONNÚ ESHUTDOWNÚEISCONNÚEBADFÚ ECONNABORTEDÚEPIPEÚEAGAINÚ errorcodec CsHz t |¡WStttfk rB|tkr6t|YSd|YSXdS)NzUnknown error %s)ÚosÚstrerrorÚ ValueErrorÚ OverflowErrorÚ NameErrorr)Úerr©rú-/usr/local/python38/lib/python3.8/asyncore.pyÚ _strerrorDs   rc@s eZdZdS)ÚExitNowN)Ú__name__Ú __module__Ú __qualname__rrrrrLsrcCs:z | ¡Wn(tk r"‚Yn| ¡YnXdS©N)Úhandle_read_eventÚ_reraised_exceptionsÚ handle_error©ÚobjrrrÚreadQs  r"cCs:z | ¡Wn(tk r"‚Yn| ¡YnXdSr)Úhandle_write_eventrrr rrrÚwriteYs  r$cCs:z | ¡Wn(tk r"‚Yn| ¡YnXdSr)Úhandle_expt_eventrrr rrrÚ _exceptionas  r&c CsÆzX|tj@r| ¡|tj@r&| ¡|tj@r8| ¡|tjtjBtj B@rV|  ¡Wnht k rš}z$|j dt kr‚| ¡n|  ¡W5d}~XYn(tk r®‚Yn| ¡YnXdS©Nr)ÚselectÚPOLLINrÚPOLLOUTr#ÚPOLLPRIr%ÚPOLLHUPÚPOLLERRÚPOLLNVALÚ handle_closeÚOSErrorÚargsÚ _DISCONNECTEDrr)r!ÚflagsÚerrrÚ readwriteis"     r5çc Cs<|dkr t}|r8g}g}g}t| ¡ƒD]L\}}| ¡}| ¡}|rP| |¡|rd|jsd| |¡|sl|r*| |¡q*g|kr–|kr–|kr¨nnt |¡dSt   ||||¡\}}}|D] }|  |¡}|dkrÚqÂt |ƒqÂ|D]"}|  |¡}|dkrqèt |ƒqè|D]&}|  |¡}|dkr,qt |ƒqdSr)Ú socket_mapÚlistÚitemsÚreadableÚwritableÚappendÚ acceptingÚtimeÚsleepr(Úgetr"r$r&) ÚtimeoutÚmapÚrÚwr4Úfdr!Zis_rZis_wrrrÚpoll}sD    "        rFcCsÀ|dkr t}|dk r t|dƒ}t ¡}|r¼t| ¡ƒD]L\}}d}| ¡r\|tjtjBO}|  ¡rt|j st|tj O}|r8|  ||¡q8| |¡}|D]&\}}|  |¡}|dkr°q”t||ƒq”dS)Nièr)r7Úintr(rFr8r9r:r)r+r;r=r*Úregisterr@r5)rArBZpollsterrEr!r3rCrrrÚpoll2¤s(     rIç>@FcCsb|dkr t}|r ttdƒr t}nt}|dkr>|r^|||ƒq,n |r^|dkr^|||ƒ|d}q>dS)NrFré)r7Úhasattrr(rIrF)rAZuse_pollrBÚcountZpoll_funrrrÚloopÀs  rNc@s2eZdZdZdZdZdZdZdZe dhƒZ dAdd„Z dd„Z dBdd „Z dCd d „Zejejfd d „ZdDdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„ZdEd'd(„Zd)d*„Z d+d,„Z!d-d.„Z"d/d0„Z#d1d2„Z$d3d4„Z%d5d6„Z&d7d8„Z'd9d:„Z(d;d<„Z)d=d>„Z*d?d@„Z+dS)FÚ dispatcherFNÚwarningc Cs |dkrt|_n||_d|_|r–| d¡| ||¡d|_z| ¡|_Wqœtk r’}z*|j dt t fkrvd|_n |  |¡‚W5d}~XYqœXnd|_ dS©NrTF)r7Ú_mapÚ_filenoÚ setblockingÚ set_socketÚ connectedÚ getpeernameÚaddrr0r1rrÚ del_channelÚsocket)ÚselfÚsockrBrrrrÚ__init__Üs    zdispatcher.__init__cCs˜|jjd|jjg}|jr.|jr.| d¡n|jr>| d¡|jdk r‚z| d|j¡Wn$tk r€| t|jƒ¡YnXdd  |¡t |ƒfS)NÚ.Z listeningrVz%s:%dz <%s at %#x>ú ) Ú __class__rrr=rXr<rVÚ TypeErrorÚreprÚjoinÚid)r[ÚstatusrrrÚ__repr__üs    zdispatcher.__repr__cCs|dkr|j}|||j<dSr)rRrS)r[rBrrrÚ add_channel szdispatcher.add_channelcCs,|j}|dkr|j}||kr"||=d|_dSr)rSrR)r[rBrErrrrYs zdispatcher.del_channelcCs.||f|_t ||¡}| d¡| |¡dSr')Zfamily_and_typerZrTrU)r[ÚfamilyÚtyper\rrrÚ create_sockets   zdispatcher.create_socketcCs||_| ¡|_| |¡dSr)rZÚfilenorSrg©r[r\rBrrrrUs zdispatcher.set_socketcCsDz*|j tjtj|j tjtj¡dB¡Wntk r>YnXdS)NrK)rZÚ setsockoptÚ SOL_SOCKETÚ SO_REUSEADDRÚ getsockoptr0©r[rrrÚset_reuse_addr#s ÿÿþzdispatcher.set_reuse_addrcCsdS©NTrrqrrrr:4szdispatcher.readablecCsdSrsrrqrrrr;7szdispatcher.writablecCs(d|_tjdkr|dkrd}|j |¡S)NTÚnté)r=rÚnamerZÚlisten)r[Únumrrrrw>szdispatcher.listencCs||_|j |¡Sr)rXrZÚbind)r[rXrrrryDszdispatcher.bindcCspd|_d|_|j |¡}|tttfks8|tkrBtj dkrB||_ dS|dt fkr^||_ |  ¡nt |t|ƒ‚dS)NFTrtr)rVÚ connectingrZÚ connect_exrrrrrrvrXr Úhandle_connect_eventr0r)r[ÚaddressrrrrÚconnectHs ÿÿ  zdispatcher.connectc Csvz|j ¡\}}WnVtk r(YdStk rh}z$|jdtttfkrVWY¢ dS‚W5d}~XYn X||fSdSr')rZÚacceptrar0r1rr r )r[ÚconnrXÚwhyrrrrVs zdispatcher.acceptc Cstz|j |¡}|WStk rn}z>|jdtkrz:uncaptured python exception, closing channel %s (%s:%s %s)Úerror)Úcompact_tracebackrbrdrr/)r[ÚnilÚtÚvÚtbinfoZ self_reprrrrrÈs üù zdispatcher.handle_errorcCs| dd¡dS)Nz!unhandled incoming priority eventrP©rrqrrrr—Üszdispatcher.handle_exptcCs| dd¡dS)Nzunhandled read eventrPržrqrrrr’ßszdispatcher.handle_readcCs| dd¡dS)Nzunhandled write eventrPržrqrrrr–âszdispatcher.handle_writecCs| dd¡dS)Nzunhandled connect eventrPržrqrrrr”åszdispatcher.handle_connectcCs| ¡}|dk r|j|ŽdSr)rÚhandle_accepted)r[Zpairrrrr‘èszdispatcher.handle_acceptcCs| ¡| dd¡dS)Nzunhandled accepted eventrP)r‡r)r[r\rXrrrrŸíszdispatcher.handle_acceptedcCs| dd¡| ¡dS)Nzunhandled close eventrP)rr‡rqrrrr/ñs zdispatcher.handle_close)NN)N)N)N)r),rrrÚdebugrVr=rzÚclosingrXÚ frozensetrŽr]rfrgrYrZÚAF_INETÚ SOCK_STREAMrjrUrrr:r;rwryr~rr‚r†r‡rŒrrr|r#r%rr—r’r–r”r‘rŸr/rrrrrOÒsJ         rOc@s6eZdZd dd„Zdd„Zdd„Zdd „Zd d „ZdS) Údispatcher_with_sendNcCst |||¡d|_dS)Nr…)rOr]Ú out_bufferrlrrrr]üszdispatcher_with_send.__init__cCs.d}t ||jdd…¡}|j|d…|_dS)Nri)rOr‚r¦)r[Znum_sentrrrÚ initiate_sendsz"dispatcher_with_send.initiate_sendcCs | ¡dSr)r§rqrrrr–sz!dispatcher_with_send.handle_writecCs|j pt|jƒSr)rVÚlenr¦rqrrrr;szdispatcher_with_send.writablecCs0|jr| dt|ƒ¡|j||_| ¡dS)Nz sending %s)r rrbr¦r§)r[rƒrrrr‚ s zdispatcher_with_send.send)NN)rrrr]r§r–r;r‚rrrrr¥ús  r¥cCs‚t ¡\}}}g}|stdƒ‚|rL| |jjj|jjjt|j ƒf¡|j }q~|d\}}}d  dd„|Dƒ¡}|||f|||fS)Nztraceback does not existéÿÿÿÿr_cSsg|] }d|‘qS)z [%s|%s|%s]r)Ú.0ÚxrrrÚ &sz%compact_traceback..) rˆÚexc_infoÚAssertionErrorr<Útb_frameÚf_codeÚ co_filenameÚco_namerŠÚ tb_linenoÚtb_nextrc)r›rœÚtbrÚfileÚfunctionÚlinerrrrr™sýr™c Cs”|dkr t}t| ¡ƒD]n}z | ¡Wqtk r`}z|jdtkrJn|sP‚W5d}~XYqtk rt‚Yq|s€‚YqXq| ¡dSr') r7r8Úvaluesr‡r0r1r rÚclear)rBZ ignore_allr«rrrÚ close_all)s   r»Úposixc@sNeZdZdd„Zdd„Zdd„Zdd„Zdd d „ZeZeZ d d „Z dd„Z d S)Ú file_wrappercCst |¡|_dSr)rÚduprE©r[rErrrr]Nszfile_wrapper.__init__cCs*|jdkrtjd|t|d| ¡dS)Nrzunclosed file %r)Úsource)rEÚwarningsÚwarnÚResourceWarningr‡rqrrrÚ__del__Qs   ÿzfile_wrapper.__del__cGstj|jf|žŽSr)rr"rE©r[r1rrrr†Wszfile_wrapper.recvcGstj|jf|žŽSr)rr$rErÅrrrr‚Zszfile_wrapper.sendNcCs(|tjkr|tjkr|sdStdƒ‚dS)Nrz-Only asyncore specific behaviour implemented.)rZrnr“ÚNotImplementedError)r[ÚlevelZoptnameÚbuflenrrrrp]s ÿþzfile_wrapper.getsockoptcCs(|jdkrdS|j}d|_t |¡dS)Nrr©)rErr‡r¿rrrr‡hs  zfile_wrapper.closecCs|jSr)rErqrrrrkoszfile_wrapper.fileno)N) rrrr]rÄr†r‚rpr"r$r‡rkrrrrr½Is r½c@seZdZddd„Zdd„ZdS)Úfile_dispatcherNcCsPt |d|¡d|_z | ¡}Wntk r4YnX| |¡t |d¡dS)NTF)rOr]rVrkÚAttributeErrorÚset_filerÚ set_blocking)r[rErBrrrr]ts  zfile_dispatcher.__init__cCs"t|ƒ|_|j ¡|_| ¡dSr)r½rZrkrSrgr¿rrrrËs  zfile_dispatcher.set_file)N)rrrr]rËrrrrrÉrs rÉ)r6N)r6N)rJFNN)NF).Ú__doc__r(rZrˆr>rÁrÚerrnorrrrrrrr r r r r rr¢r2r7rrÚ ExceptionrÚKeyboardInterruptÚ SystemExitrr"r$r&r5rFrIZpoll3rNrOr¥r™r»rvr½rÉrrrrÚsD< ÿ   '  *  )