grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026 ”qcˆNã@s dZddlZddlZddlZddlZddlZddlZddlmZm Z m Z m Z m Z m Z mZmZmZmZmZmZmZee e eeeehƒZyeWnek ræiZYnXdd„ZGdd„deƒZeeefZdd „Zd d „Z d d „Z!dd„Z"dddd„Z#dddd„Z$e$Z%dddddd„Z&Gdd„dƒZ'Gdd„de'ƒZ(dd„Z)dddd „Z*ej+d!kr Gd"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 CsOytj|ƒSWn7tttfk rJ|tkr>t|Sd|SYnXdS)NzUnknown error %s)ÚosÚstrerrorÚ ValueErrorÚ OverflowErrorÚ NameErrorr)Úerr©rú-/opt/alt/python35/lib64/python3.5/asyncore.pyÚ _strerrorDs  rc@seZdZdS)ÚExitNowN)Ú__name__Ú __module__Ú __qualname__rrrrrLs rc Cs;y|jƒWn&tk r%‚Yn|jƒYnXdS)N)Úhandle_read_eventÚ_reraised_exceptionsÚ handle_error)ÚobjrrrÚreadQs  r c Cs;y|jƒWn&tk r%‚Yn|jƒYnXdS)N)Úhandle_write_eventrr)rrrrÚwriteYs  r"c Cs;y|jƒWn&tk r%‚Yn|jƒYnXdS)N)Úhandle_expt_eventrr)rrrrÚ _exceptionas  r$cCséyn|tj@r|jƒ|tj@r1|jƒ|tj@rH|jƒ|tjtjBtj B@rm|j ƒWntt k r¿}z/|j dt kr£|jƒn |j ƒWYdd}~Xn&tk rÓ‚Yn|jƒYnXdS)Nr)ÚselectÚPOLLINrÚPOLLOUTr!ÚPOLLPRIr#ZPOLLHUPZPOLLERRZPOLLNVALÚ handle_closeÚOSErrorÚargsÚ _DISCONNECTEDrr)rÚflagsÚerrrÚ readwriteis"        r/gc Cs¶|dkrt}|r²g}g}g}x�t|jƒƒD]m\}}|jƒ}|jƒ}|rt|j|ƒ|r‘|j r‘|j|ƒ|s�|r=|j|ƒq=Wg|koÐ|koÐ|knrætj|ƒdSt j ||||ƒ\}}}x6|D].}|j |ƒ}|dkr2qt |ƒqWx6|D].}|j |ƒ}|dkrkqGt |ƒqGWx6|D].}|j |ƒ}|dkr¤q€t |ƒq€WdS)N)Ú socket_mapÚlistÚitemsÚreadableÚwritableÚappendÚ acceptingÚtimeZsleepr%Úgetr r"r$) ÚtimeoutÚmapÚrÚwr.ÚfdrZis_rZis_wrrrÚpoll}sD      ' !      r>cCs|dkrt}|dk r.t|dƒ}tjƒ}|rxt|jƒƒD]k\}}d}|jƒr…|tjtjBO}|j ƒr¨|j r¨|tj O}|rS|j ||ƒqSW|j|ƒ}x?|D]7\}}|j |ƒ}|dkrqØt||ƒqØWdS)Nièr)r0Úintr%r>r1r2r3r&r(r4r6r'Úregisterr8r/)r9r:Zpollsterr=rr-r;rrrÚpoll2¤s(      rAg>@FcCs“|dkrt}|r0ttdƒr0t}nt}|dkr_xJ|r[|||ƒqEWn0x-|rŽ|dkrŽ|||ƒ|d}qbWdS)Nr>ré)r0Úhasattrr%rAr>)r9Zuse_pollr:ÚcountZpoll_funrrrÚloopÀs     rEc@sÏeZdZdZdZdZdZdZdZe dhƒZ dddd„Z dd„Z e Z ddd „Zdd d „Zejejd d „Zddd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'd(„Z d)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)AÚ dispatcherFNÚwarningcCsÖ|dkrt|_n ||_d|_|rÉ|jdƒ|j||ƒd|_y|jƒ|_WqÒtk rÅ}z:|j dt t fkr£d|_n|j |ƒ‚WYdd}~XqÒXn d|_ dS)NrTF)r0Ú_mapÚ_filenoÚ setblockingÚ set_socketÚ connectedZ getpeernameÚaddrr*r+rrÚ del_channelÚsocket)ÚselfÚsockr:rrrrÚ__init__Üs         zdispatcher.__init__c CsÄ|jjd|jjg}|jr?|jr?|jdƒn|jrU|jdƒ|jdk r§y|jd|jƒWn(tk r¦|jt|jƒƒYnXddj |ƒt |ƒfS)NÚ.Z listeningrLz%s:%dz <%s at %#x>ú ) Ú __class__rrr6rMr5rLÚ TypeErrorÚreprÚjoinÚid)rPZstatusrrrÚ__repr__üs   zdispatcher.__repr__cCs&|dkr|j}|||j|j}|dkr|j}||kr1||=d|_dS)N)rIrH)rPr:r=rrrrNs     zdispatcher.del_channelcCs?||f|_tj||ƒ}|jdƒ|j|ƒdS)Nr)Zfamily_and_typerOrJrK)rPZfamilyÚtyperQrrrÚ create_sockets zdispatcher.create_socketcCs)||_|jƒ|_|j|ƒdS)N)rOÚfilenorIr[)rPrQr:rrrrK s zdispatcher.set_socketc CsRy9|jjtjtj|jjtjtjƒdBƒWntk rMYnXdS)NrB)rOZ setsockoptÚ SOL_SOCKETZ SO_REUSEADDRÚ getsockoptr*)rPrrrÚset_reuse_addr&s   zdispatcher.set_reuse_addrcCsdS)NTr)rPrrrr37szdispatcher.readablecCsdS)NTr)rPrrrr4:szdispatcher.writablecCs:d|_tjdkr*|dkr*d}|jj|ƒS)NTÚnté)r6rÚnamerOÚlisten)rPZnumrrrreAs zdispatcher.listencCs||_|jj|ƒS)N)rMrOÚbind)rPrMrrrrfGs zdispatcher.bindcCs d|_d|_|jj|ƒ}|tttfksT|tkratj dkra||_ dS|dt fkr‰||_ |j ƒnt |t|ƒ‚dS)NFTrbÚcer)rbrg)rLÚ connectingrOZ connect_exrrrrrrdrMr Úhandle_connect_eventr*r)rPZaddressrrrrÚconnectKs     zdispatcher.connectcCs‡y|jjƒ\}}Wn]tk r1dSYnRtk rx}z(|jdtttfkrcdS‚WYdd}~Xn X||fSdS)Nr)rOÚacceptrVr*r+rr r )rPZconnrMÚwhyrrrrkYs zdispatcher.acceptcCs�y|jj|ƒ}|SWn`tk r|}z@|jdtkrFdS|jdtkrg|jƒdS‚WYdd}~XnXdS)Nr)rOÚsendr*r+rr,r))rPÚdataÚresultrlrrrrmgs zdispatcher.sendcCs~y.|jj|ƒ}|s)|jƒdS|SWnItk ry}z)|jdtkrd|jƒdS‚WYdd}~XnXdS)Nór)rOÚrecvr)r*r+r,)rPZ buffer_sizernrlrrrrqts  zdispatcher.recvcCs�d|_d|_d|_|jƒ|jdk r‰y|jjƒWnAtk rˆ}z!|jdtt fkrv‚WYdd}~XnXdS)NFr) rLr6rhrNrOÚcloser*r+rr )rPrlrrrrr†s    zdispatcher.closecCstjjdt|ƒƒdS)Nzlog: %s )ÚsysÚstderrr"Ústr)rPÚmessagerrrÚlog–szdispatcher.logÚinfocCs'||jkr#td||fƒdS)Nz%s: %s)Úignore_log_typesÚprint)rPrvr\rrrÚlog_info™szdispatcher.log_infocCsM|jr|jƒn3|js?|jr2|jƒ|jƒn |jƒdS)N)r6Ú handle_acceptrLrhriÚ handle_read)rPrrrr�s      zdispatcher.handle_read_eventcCs\|jjtjtjƒ}|dkr<t|t|ƒƒ‚|jƒd|_d|_dS)NrTF) rOr`r_ÚSO_ERRORr*rÚhandle_connectrLrh)rPrrrrri©s    zdispatcher.handle_connect_eventcCs7|jr dS|js)|jr)|jƒ|jƒdS)N)r6rLrhriÚ handle_write)rPrrrr!±s     zdispatcher.handle_write_eventcCsB|jjtjtjƒ}|dkr4|jƒn |jƒdS)Nr)rOr`r_r~r)Ú handle_expt)rPrrrrr#¼s  zdispatcher.handle_expt_eventc Csntƒ\}}}}yt|ƒ}Wndt|ƒ}YnX|jd||||fdƒ|jƒdS)Nz)<__repr__(self) failed for object at %0x>z:uncaptured python exception, closing channel %s (%s:%s %s)Úerror)Úcompact_tracebackrWrYr{r))rPZnilÚtÚvÚtbinfoZ self_reprrrrrËszdispatcher.handle_errorcCs|jddƒdS)Nz!unhandled incoming priority eventrG)r{)rPrrrr�ßszdispatcher.handle_exptcCs|jddƒdS)Nzunhandled read eventrG)r{)rPrrrr}âszdispatcher.handle_readcCs|jddƒdS)Nzunhandled write eventrG)r{)rPrrrr€åszdispatcher.handle_writecCs|jddƒdS)Nzunhandled connect eventrG)r{)rPrrrrèszdispatcher.handle_connectcCs)|jƒ}|dk r%|j|ŒdS)N)rkÚhandle_accepted)rPZpairrrrr|ës  zdispatcher.handle_acceptcCs|jƒ|jddƒdS)Nzunhandled accepted eventrG)rrr{)rPrQrMrrrr‡ðs zdispatcher.handle_acceptedcCs|jddƒ|jƒdS)Nzunhandled close eventrG)r{rr)rPrrrr)ôszdispatcher.handle_close)-rrrÚdebugrLr6rhÚclosingrMÚ frozensetryrRrZÚ__str__r[rNrOZAF_INETZ SOCK_STREAMr]rKrar3r4rerfrjrkrmrqrrrwr{rrir!r#rr�r}r€rr|r‡r)rrrrrFÒsL                      rFc@sReZdZdddd„Zdd„Zdd„Zdd „Zd d „ZdS) Údispatcher_with_sendNcCs tj|||ƒd|_dS)Nrp)rFrRÚ out_buffer)rPrQr:rrrrRÿszdispatcher_with_send.__init__cCs?d}tj||jdd…ƒ}|j|d…|_dS)Nri)rFrmr�)rPZnum_sentrrrÚ initiate_sendsz"dispatcher_with_send.initiate_sendcCs|jƒdS)N)rŽ)rPrrrr€sz!dispatcher_with_send.handle_writecCs|j pt|jƒS)N)rLÚlenr�)rPrrrr4 szdispatcher_with_send.writablecCs>|jr |jdt|ƒƒ|j||_|jƒdS)Nz sending %s)rˆr{rWr�rŽ)rPrnrrrrms zdispatcher_with_send.send)rrrrRrŽr€r4rmrrrrrŒýs    rŒcCs¿tjƒ\}}}g}|s-tdƒ‚xD|rs|j|jjj|jjjt|j ƒfƒ|j }q0W~|d\}}}dj dd„|Dƒƒ}|||f|||fS)Nztraceback does not existrBrTcSsg|]}d|‘qS)z [%s|%s|%s]r)Ú.0Úxrrrú )s z%compact_traceback..éÿÿÿÿ) rsÚexc_infoÚAssertionErrorr5Útb_frameÚf_codeÚ co_filenameÚco_nameruÚ tb_linenoÚtb_nextrX)r„r…Útbr†ÚfileZfunctionÚlinerxrrrrƒs     rƒcCs¶|dkrt}x“t|jƒƒD]}y|jƒWq%tk r}z$|jdtkrdn |sm‚WYdd}~Xq%tk r“‚Yq%|sŸ‚Yq%Xq%W|jƒdS)Nr) r0r1Úvaluesrrr*r+r rÚclear)r:Z ignore_allr‘rrrÚ close_all,s    r¡Úposixc@sseZdZdd„Zdd„Zdd„Zdd„Zd d d „ZeZeZ d d „Z dd„Z d S)Ú file_wrappercCstj|ƒ|_dS)N)rÚdupr=)rPr=rrrrRQszfile_wrapper.__init__cCs1|jdkr#tjd|tƒ|jƒdS)Nrzunclosed file %r)r=ÚwarningsÚwarnÚResourceWarningrr)rPrrrÚ__del__Tszfile_wrapper.__del__cGstj|j|ŒS)N)rr r=)rPr+rrrrqYszfile_wrapper.recvcGstj|j|ŒS)N)rr"r=)rPr+rrrrm\szfile_wrapper.sendNcCs9|tjkr)|tjkr)| r)dStdƒ‚dS)Nrz-Only asyncore specific behaviour implemented.)rOr_r~ÚNotImplementedError)rPÚlevelZoptnameZbuflenrrrr`_s zfile_wrapper.getsockoptcCs0|jdkrdStj|jƒd|_dS)NrrBr“)r=rrr)rPrrrrrjszfile_wrapper.closecCs|jS)N)r=)rPrrrr^pszfile_wrapper.fileno) rrrrRr¨rqrmr`r r"rrr^rrrrr£Ls      r£c@s+eZdZddd„Zdd„ZdS)Úfile_dispatcherNc Csbtj|d|ƒd|_y|jƒ}Wntk r@YnX|j|ƒtj|dƒdS)NTF)rFrRrLr^ÚAttributeErrorÚset_filerÚ set_blocking)rPr=r:rrrrRus   zfile_dispatcher.__init__cCs/t|ƒ|_|jjƒ|_|jƒdS)N)r£rOr^rIr[)rPr=rrrr­€szfile_dispatcher.set_file)rrrrRr­rrrrr«ss  r«).Ú__doc__r%rOrsr7r¥rÚerrnorrrrrrrr r r r r rrŠr,r0rrÚ ExceptionrÚKeyboardInterruptÚ SystemExitrr r"r$r/r>rAZpoll3rErFrŒrƒr¡rdr£r«rrrrÚ/s@      X        'ÿ, '