ž ­ÿfQc@sdZddlZddlZddlZddlZddlZddlZddlmZm Z m Z m Z m Z m Z mZmZmZmZmZmZmZee e eeeefƒZyeWnek ræiZYnXdd„ZGdd„deƒZeeefZdd „Zd d „Z d d „Z!dd„Z"de#dd„Z$de#dd„Z%e%Z&de'e#e#dd„Z(Gdd„dƒZ)Gdd„de)ƒZ*dd„Z+e#e'dd„Z,ej-d krddl.Z.Gd!d"„d"ƒZ/Gd#d$„d$e)ƒZ0ndS(%u 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. iN( uEALREADYu EINPROGRESSu EWOULDBLOCKu ECONNRESETuEINVALuENOTCONNu ESHUTDOWNuEISCONNuEBADFu ECONNABORTEDuEPIPEuEAGAINu errorcodec CsOytj|ƒSWn7tttfk rJ|tkr>t|Sd|SYnXdS(NuUnknown error %s(uosustrerroru ValueErroru OverflowErroru NameErroru errorcode(uerr((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu _strerrorDs  u _strerrorcBs|EeZdZdS(uExitNowN(u__name__u __module__u __qualname__(u __locals__((u-/opt/alt/python33/lib64/python3.3/asyncore.pyuExitNowLsuExitNowc Cs;y|jƒWn&tk r%‚Yn|jƒYnXdS(N(uhandle_read_eventu_reraised_exceptionsu handle_error(uobj((u-/opt/alt/python33/lib64/python3.3/asyncore.pyureadQs  ureadc Cs;y|jƒWn&tk r%‚Yn|jƒYnXdS(N(uhandle_write_eventu_reraised_exceptionsu handle_error(uobj((u-/opt/alt/python33/lib64/python3.3/asyncore.pyuwriteYs  uwritec Cs;y|jƒWn&tk r%‚Yn|jƒYnXdS(N(uhandle_expt_eventu_reraised_exceptionsu handle_error(uobj((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu _exceptionas  u _exceptioncCsøyz|tj@r|jƒn|tj@r7|jƒn|tj@rQ|jƒn|tjtjBtj B@ry|j ƒnWnwt j k rÎ}z/|j dtkr²|jƒn |j ƒWYdd}~Xn&tk râ‚Yn|jƒYnXdS(Ni(uselectuPOLLINuhandle_read_eventuPOLLOUTuhandle_write_eventuPOLLPRIuhandle_expt_eventuPOLLHUPuPOLLERRuPOLLNVALu handle_closeusocketuerroruargsu _DISCONNECTEDu handle_erroru_reraised_exceptions(uobjuflagsue((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu readwriteis"        u readwritegc Csë|dkrt}n|rçg}g}g}xŠt|jƒƒD]v\}}|jƒ}|jƒ}|rz|j|ƒn|rš|j rš|j|ƒn|s¦|r@|j|ƒq@q@Wg|koÜ|koÜ|knròtj |ƒdSy%t j ||||ƒ\}}}Wnt k r/dSYnXx9|D]1}|j |ƒ}|dkr^q7nt |ƒq7Wx9|D]1}|j |ƒ}|dkršqsnt|ƒqsWx<|D]1}|j |ƒ}|dkrÖq¯nt|ƒq¯WndS(N(uNoneu socket_mapulistuitemsureadableuwritableuappendu acceptingutimeusleepuselectuInterruptedErrorugetureaduwriteu _exception( utimeoutumapuruwueufduobjuis_ruis_w((u-/opt/alt/python33/lib64/python3.3/asyncore.pyupoll}sJ     ' %        upollc CsK|dkrt}n|dk r4t|dƒ}ntjƒ}|rGxˆt|jƒƒD]t\}}d}|jƒrŽ|tjtj BO}n|j ƒr´|j r´|tj O}n|rY|j ||ƒqYqYWy|j|ƒ}Wntk rþg}YnXxE|D]:\}}|j|ƒ}|dkr3qnt||ƒqWndS(Nièi(uNoneu socket_mapuintuselectupollulistuitemsureadableuPOLLINuPOLLPRIuwritableu acceptinguPOLLOUTuregisteruInterruptedErrorugetu readwrite(utimeoutumapupollsterufduobjuflagsur((u-/opt/alt/python33/lib64/python3.3/asyncore.pyupoll2§s.        upoll2g>@cCs–|dkrt}n|r3ttdƒr3t}nt}|dkrbxJ|r^|||ƒqHWn0x-|r‘|dkr‘|||ƒ|d}qeWdS(Nupollii(uNoneu socket_mapuhasattruselectupoll2upoll(utimeoutuuse_pollumapucountupoll_fun((u-/opt/alt/python33/lib64/python3.3/asyncore.pyuloopÅs      uloopcBsß|EeZdZdBZdBZdBZdBZdBZdAZ e dgƒZ dAdAdd„Z dd„ZeZdAdd„ZdAdd „Zejejd d „ZdAd d „Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Z d"d#„Z!d$d%„Z"d&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/dAS(Cu dispatcheruwarningcCsÙ|dkrt|_n ||_d|_|rÌ|jdƒ|j||ƒd|_y|jƒ|_ WqÕt j k rÈ}z:|j dt tfkr¦d|_n|j|ƒ‚WYdd}~XqÕXn d|_ dS(NiTF(uNoneu socket_mapu_mapu_filenou setblockingu set_socketuTrueu connectedu getpeernameuaddrusocketuerroruargsuENOTCONNuEINVALuFalseu del_channel(uselfusockumapuerr((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu__init__ás         udispatcher.__init__c CsÊ|jjd|jjg}|jr?|jr?|jdƒn|jrX|jdƒn|jdk r­y|jd|jƒWq­tk r©|jt |jƒƒYq­Xnddj |ƒt |ƒfS(Nu.u listeningu connectedu%s:%du <%s at %#x>u ( u __class__u __module__u__name__u acceptinguaddruappendu connecteduNoneu TypeErrorureprujoinuid(uselfustatus((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu__repr__s  udispatcher.__repr__cCs)|dkr|j}n|||ju:uncaptured python exception, closing channel %s (%s:%s %s)uerror(ucompact_tracebackurepruidulog_infou handle_close(uselfunilutuvutbinfou self_repr((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu handle_errorÝsudispatcher.handle_errorcCs|jddƒdS(Nu!unhandled incoming priority eventuwarning(ulog_info(uself((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu handle_exptñsudispatcher.handle_exptcCs|jddƒdS(Nuunhandled read eventuwarning(ulog_info(uself((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu handle_readôsudispatcher.handle_readcCs|jddƒdS(Nuunhandled write eventuwarning(ulog_info(uself((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu handle_write÷sudispatcher.handle_writecCs|jddƒdS(Nuunhandled connect eventuwarning(ulog_info(uself((u-/opt/alt/python33/lib64/python3.3/asyncore.pyuhandle_connectúsudispatcher.handle_connectcCs,|jƒ}|dk r(|j|ŒndS(N(uacceptuNoneuhandle_accepted(uselfupair((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu handle_acceptýs  udispatcher.handle_acceptcCs|jƒ|jddƒdS(Nuunhandled accepted eventuwarning(ucloseulog_info(uselfusockuaddr((u-/opt/alt/python33/lib64/python3.3/asyncore.pyuhandle_accepteds udispatcher.handle_acceptedcCs|jddƒ|jƒdS(Nuunhandled close eventuwarning(ulog_infouclose(uself((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu handle_closesudispatcher.handle_closeNF(0u__name__u __module__u __qualname__uFalseudebugu connectedu acceptingu connectinguclosinguNoneuaddru frozensetuignore_log_typesu__init__u__repr__u__str__u add_channelu del_channelusocketuAF_INETu SOCK_STREAMu create_socketu set_socketuset_reuse_addrureadableuwritableulistenubinduconnectuacceptusendurecvucloseu __getattr__ulogulog_infouhandle_read_eventuhandle_connect_eventuhandle_write_eventuhandle_expt_eventu handle_erroru handle_exptu handle_readu handle_writeuhandle_connectu handle_acceptuhandle_acceptedu handle_close(u __locals__((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu dispatcher×sN                     u dispatchercBsV|EeZdZd d dd„Zdd„Zdd„Zdd„Zd d „Zd S( udispatcher_with_sendcCs tj|||ƒd|_dS(Ns(u dispatcheru__init__u out_buffer(uselfusockumap((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu__init__sudispatcher_with_send.__init__cCs?d}tj||jdd…ƒ}|j|d…|_dS(Nii(u dispatcherusendu out_buffer(uselfunum_sent((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu initiate_sendsu"dispatcher_with_send.initiate_sendcCs|jƒdS(N(u initiate_send(uself((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu handle_writesu!dispatcher_with_send.handle_writecCs|j pt|jƒS(N(u connectedulenu out_buffer(uself((u-/opt/alt/python33/lib64/python3.3/asyncore.pyuwritablesudispatcher_with_send.writablecCsA|jr#|jdt|ƒƒn|j||_|jƒdS(Nu sending %s(udebugulog_infourepru out_bufferu initiate_send(uselfudata((u-/opt/alt/python33/lib64/python3.3/asyncore.pyusend s udispatcher_with_send.sendN( u__name__u __module__u __qualname__uNoneu__init__u initiate_sendu handle_writeuwritableusend(u __locals__((u-/opt/alt/python33/lib64/python3.3/asyncore.pyudispatcher_with_sends    udispatcher_with_sendcCsÂtjƒ\}}}g}|s0tdƒ‚nxD|rv|j|jjj|jjjt|j ƒfƒ|j }q3W~|d\}}}dj dd„|Dƒƒ}|||f|||fS(Nutraceback does not existiu cSsg|]}d|‘qS(u [%s|%s|%s]((u.0ux((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu ;s u%compact_traceback..iÿÿÿÿ( usysuexc_infouAssertionErroruappendutb_frameuf_codeu co_filenameuco_nameustru tb_linenoutb_nextujoin(utuvutbutbinfoufileufunctionulineuinfo((u-/opt/alt/python33/lib64/python3.3/asyncore.pyucompact_traceback*s    ucompact_tracebackcCs¿|dkrt}nx™t|jƒƒD]…}y|jƒWq(tk r…}z'|jdtkrgn |ss‚nWYdd}~Xq(tk r™‚Yq(|s¨‚nYq(Xq(W|j ƒdS(Ni( uNoneu socket_mapulistuvaluesucloseuOSErroruargsuEBADFu_reraised_exceptionsuclear(umapu ignore_allux((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu close_all>s    u close_alluposixcBsk|EeZdZdd„Zdd„Zdd„Zd dd„ZeZeZ d d „Z d d „Z d S(u file_wrappercCstj|ƒ|_dS(N(uosudupufd(uselfufd((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu__init__esufile_wrapper.__init__cGstj|j|ŒS(N(uosureadufd(uselfuargs((u-/opt/alt/python33/lib64/python3.3/asyncore.pyurecvhsufile_wrapper.recvcGstj|j|ŒS(N(uosuwriteufd(uselfuargs((u-/opt/alt/python33/lib64/python3.3/asyncore.pyusendksufile_wrapper.sendcCs9|tjkr)|tjkr)| r)dStdƒ‚dS(Niu-Only asyncore specific behaviour implemented.(usocketu SOL_SOCKETuSO_ERRORuNotImplementedError(uselfuleveluoptnameubuflen((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu getsockoptns ufile_wrapper.getsockoptcCstj|jƒdS(N(uosucloseufd(uself((u-/opt/alt/python33/lib64/python3.3/asyncore.pyucloseysufile_wrapper.closecCs|jS(N(ufd(uself((u-/opt/alt/python33/lib64/python3.3/asyncore.pyufileno|sufile_wrapper.filenoN( u__name__u __module__u __qualname__u__init__urecvusenduNoneu getsockoptureaduwriteucloseufileno(u __locals__((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu file_wrapper`s    u file_wrappercBs/|EeZdZddd„Zdd„ZdS(ufile_dispatcherc Cstj|d|ƒd|_y|jƒ}Wntk r@YnX|j|ƒtj|tj dƒ}|t j B}tj|tj |ƒdS(NiT( u dispatcheru__init__uNoneuTrueu connectedufilenouAttributeErroruset_fileufcntluF_GETFLuosu O_NONBLOCKuF_SETFL(uselfufdumapuflags((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu__init__s    ufile_dispatcher.__init__cCs/t|ƒ|_|jjƒ|_|jƒdS(N(u file_wrapperusocketufilenou_filenou add_channel(uselfufd((u-/opt/alt/python33/lib64/python3.3/asyncore.pyuset_fileŽsufile_dispatcher.set_fileN(u__name__u __module__u __qualname__uNoneu__init__uset_file(u __locals__((u-/opt/alt/python33/lib64/python3.3/asyncore.pyufile_dispatchers ufile_dispatcher(1u__doc__uselectusocketusysutimeuwarningsuosuerrnouEALREADYu EINPROGRESSu EWOULDBLOCKu ECONNRESETuEINVALuENOTCONNu ESHUTDOWNuEISCONNuEBADFu ECONNABORTEDuEPIPEuEAGAINu errorcodeu frozensetu _DISCONNECTEDu socket_mapu NameErroru _strerroru ExceptionuExitNowuKeyboardInterruptu SystemExitu_reraised_exceptionsureaduwriteu _exceptionu readwriteuNoneupollupoll2upoll3uFalseuloopu dispatcherudispatcher_with_senducompact_tracebacku close_allunameufcntlu file_wrapperufile_dispatcher(((u-/opt/alt/python33/lib64/python3.3/asyncore.pyu/sB      X        *ÿ9