eaiovnaovbqoebvqoeavibavo B  fN@shdZddlZddlZddlZddlZddlZddlZddlmZm Z m Z m Z m Z m Z mZmZmZmZmZmZmZee e eeeehZyeWnek riZYnXddZGdddeZeeefZdd Zd d Z d d Z!ddZ"d&ddZ#d'ddZ$e$Z%d(ddZ&GdddZ'Gddde'Z(ddZ)d)dd Z*ej+d!krdGd"d#d#Z,Gd$d%d%e'Z-dS)*aBasic 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 ECONNRESETEINVALENOTCONN ESHUTDOWNEISCONNEBADF ECONNABORTEDEPIPEEAGAIN errorcodec Cs>y t|Stttfk r8|tkr0t|Sd|SXdS)NzUnknown error %s)osstrerror ValueError OverflowError NameErrorr)errr-/opt/alt/python37/lib64/python3.7/asyncore.py _strerrorDs  rc@s eZdZdS)ExitNowN)__name__ __module__ __qualname__rrrrrLsrcCs:y |Wn(tk r"Yn|YnXdS)N)handle_read_event_reraised_exceptions handle_error)objrrrreadQs  r cCs:y |Wn(tk r"Yn|YnXdS)N)handle_write_eventrr)rrrrwriteYs  r"cCs:y |Wn(tk r"Yn|YnXdS)N)handle_expt_eventrr)rrrr _exceptionas  r$c CsyX|tj@r||tj@r&||tj@r8||tjtjBtj B@rV| Wnht k r}z$|j dt kr|n| Wdd}~XYn(tk rYn|YnXdS)Nr)selectPOLLINrPOLLOUTr!POLLPRIr#ZPOLLHUPZPOLLERRZPOLLNVAL handle_closeOSErrorargs _DISCONNECTEDrr)rflagserrr readwriteis"     r/c CsL|dkr t}|rHg}g}g}x\t|D]L\}}|}|}|rR|||rf|jsf|||sn|r,||q,Wg|kr|kr|krnnt|dSt ||||\}}}x(|D] }| |}|dkrqt |qWx*|D]"}| |}|dkr qt |qWx.|D]&}| |}|dkr:qt |qWdS)N) socket_maplistitemsreadablewritableappend acceptingtimeZsleepr%getr r"r$) timeoutmaprwr.fdrZis_rZis_wrrrpoll}sD   "           r?cCs|dkr t}|dk r t|d}t}|rx\t|D]L\}}d}|r^|tjtjBO}| rv|j sv|tj O}|r:| ||q:W||}x.|D]&\}}| |}|dkrqt||qWdS)Nir)r1intr%r?r2r3r4r&r(r5r7r'registerr9r/)r:r;Zpollsterr>rr-r<rrrpoll2s(    rB>@FcCsj|dkr t}|r ttdr t}nt}|dkrBx8|r>|||q.Wn$x"|rd|dkrd||||d}qDWdS)Nr?r)r1hasattrr%rBr?)r:Zuse_pollr;countZpoll_funrrrloops rGc@s6eZdZdZdZdZdZdZdZe dhZ dAddZ ddZ e Z dBdd ZdCd d Zejejfd d ZdDddZddZddZddZddZddZddZddZddZd d!Zd"d#Zd$d%ZdEd'd(Z d)d*Z!d+d,Z"d-d.Z#d/d0Z$d1d2Z%d3d4Z&d5d6Z'd7d8Z(d9d:Z)d;d<Z*d=d>Z+d?d@Z,dS)F dispatcherFNwarningc Cs|dkrt|_n||_d|_|r|d|||d|_y||_Wqtk r}z*|j dt t fkrvd|_n | |Wdd}~XYqXnd|_ dS)NrTF)r1_map_fileno setblocking set_socket connectedZ getpeernameaddrr*r+rr del_channelsocket)selfsockr;rrrr__init__s    zdispatcher.__init__cCs|jjd|jjg}|jr.|jr.|dn|jr>|d|jdk ry|d|jWn$tk r|t|jYnXdd |t |fS)N.Z listeningrNz%s:%dz <%s at %#x> ) __class__rrr7rOr6rN TypeErrorreprjoinid)rRZstatusrrr__repr__s    zdispatcher.__repr__cCs|dkr|j}|||j<dS)N)rJrK)rRr;rrr add_channel szdispatcher.add_channelcCs,|j}|dkr|j}||kr"||=d|_dS)N)rKrJ)rRr;r>rrrrPs zdispatcher.del_channelcCs.||f|_t||}|d||dS)Nr)Zfamily_and_typerQrLrM)rRZfamilytyperSrrr create_sockets   zdispatcher.create_socketcCs||_||_||dS)N)rQfilenorKr])rRrSr;rrrrM s zdispatcher.set_socketcCsDy*|jtjtj|jtjtjdBWntk r>YnXdS)NrD)rQZ setsockopt SOL_SOCKETZ SO_REUSEADDR getsockoptr*)rRrrrset_reuse_addr%s zdispatcher.set_reuse_addrcCsdS)NTr)rRrrrr46szdispatcher.readablecCsdS)NTr)rRrrrr59szdispatcher.writablecCs(d|_tjdkr|dkrd}|j|S)NTnt)r7rnamerQlisten)rRZnumrrrrg@szdispatcher.listencCs||_|j|S)N)rOrQbind)rRrOrrrrhFszdispatcher.bindcCspd|_d|_|j|}|tttfks8|tkrBtj dkrB||_ dS|dt fkr^||_ | nt |t|dS)NFTrdr)rN connectingrQZ connect_exrrrrrrfrOr handle_connect_eventr*r)rRZaddressrrrrconnectJs   zdispatcher.connectc Csny|j\}}WnNtk r&dStk r`}z|jdtttfkrNdSWdd}~XYn X||fSdS)Nr)rQacceptrXr*r+rr r )rRZconnrOwhyrrrrlXszdispatcher.acceptc Csfy|j|}|Stk r`}z2|jdtkr4dS|jdtkrN|dSWdd}~XYnXdS)Nr)rQsendr*r+rr,r))rRdataresultrmrrrrnfs zdispatcher.sendc Cshy$|j|}|s|dS|SWn>tk rb}z |jdtkrP|dSWdd}~XYnXdS)Nr)rQrecvr)r*r+r,)rR buffer_sizerormrrrrrss zdispatcher.recvc Csnd|_d|_d|_||jdk rjy|jWn6tk rh}z|jdtt fkrXWdd}~XYnXdS)NFr) rNr7rirPrQcloser*r+rr )rRrmrrrrts zdispatcher.closecCstjdt|dS)Nzlog: %s )sysstderrr"str)rRmessagerrrlogszdispatcher.loginfocCs||jkrtd||fdS)Nz%s: %s)ignore_log_typesprint)rRrxr^rrrlog_infos zdispatcher.log_infocCs:|jr|n&|js.|jr$||n|dS)N)r7 handle_acceptrNrirj handle_read)rRrrrrs  zdispatcher.handle_read_eventcCs@|jtjtj}|dkr(t|t||d|_d|_dS)NrTF) rQrbraSO_ERRORr*rhandle_connectrNri)rRrrrrrjs zdispatcher.handle_connect_eventcCs*|jr dS|js|jr||dS)N)r7rNrirj handle_write)rRrrrr!s zdispatcher.handle_write_eventcCs0|jtjtj}|dkr$|n|dS)Nr)rQrbrarr) handle_expt)rRrrrrr#s zdispatcher.handle_expt_eventcCsXt\}}}}y t|}Wndt|}YnX|d||||fd|dS)Nz)<__repr__(self) failed for object at %0x>z:uncaptured python exception, closing channel %s (%s:%s %s)error)compact_tracebackrYr[r}r))rRZniltvtbinfoZ self_reprrrrrs zdispatcher.handle_errorcCs|dddS)Nz!unhandled incoming priority eventrI)r})rRrrrrszdispatcher.handle_exptcCs|dddS)Nzunhandled read eventrI)r})rRrrrrszdispatcher.handle_readcCs|dddS)Nzunhandled write eventrI)r})rRrrrrszdispatcher.handle_writecCs|dddS)Nzunhandled connect eventrI)r})rRrrrrszdispatcher.handle_connectcCs|}|dk r|j|dS)N)rlhandle_accepted)rRZpairrrrr~szdispatcher.handle_acceptcCs||dddS)Nzunhandled accepted eventrI)rtr})rRrSrOrrrrszdispatcher.handle_acceptedcCs|dd|dS)Nzunhandled close eventrI)r}rt)rRrrrr)s zdispatcher.handle_close)NN)N)N)N)rz)-rrrdebugrNr7riclosingrO frozensetr{rTr\__str__r]rPrQZAF_INETZ SOCK_STREAMr_rMrcr4r5rgrhrkrlrnrrrtryr}rrjr!r#rrrrrr~rr)rrrrrHsL          rHc@s6eZdZd ddZddZddZdd Zd d ZdS) dispatcher_with_sendNcCst|||d|_dS)Nrq)rHrT out_buffer)rRrSr;rrrrTszdispatcher_with_send.__init__cCs.d}t||jdd}|j|d|_dS)Nri)rHrnr)rRZnum_sentrrr initiate_sendsz"dispatcher_with_send.initiate_sendcCs |dS)N)r)rRrrrrsz!dispatcher_with_send.handle_writecCs|j pt|jS)N)rNlenr)rRrrrr5 szdispatcher_with_send.writablecCs0|jr|dt||j||_|dS)Nz sending %s)rr}rYrr)rRrorrrrn s zdispatcher_with_send.send)NN)rrrrTrrr5rnrrrrrs  rcCst\}}}g}|stdx0|rN||jjj|jjjt|j f|j }q W~|d\}}}d dd|D}|||f|||fS)Nztraceback does not existrVcSsg|] }d|qS)z [%s|%s|%s]r).0xrrr (sz%compact_traceback..) ruexc_infoAssertionErrorr6tb_framef_code co_filenameco_namerw tb_linenotb_nextrZ)rrtbrfileZfunctionlinerzrrrrs rc Cs|dkr t}x~t|D]n}y |Wqtk rb}z|jdtkrLn|sRWdd}~XYqtk rvYq|sYqXqW|dS)Nr) r1r2valuesrtr*r+r rclear)r;Z ignore_allrrrr close_all+s   rposixc@sNeZdZddZddZddZddZdd d ZeZeZ d d Z ddZ d S) file_wrappercCst||_dS)N)rdupr>)rRr>rrrrTPszfile_wrapper.__init__cCs*|jdkrtjd|t|d|dS)Nrzunclosed file %r)source)r>warningswarnResourceWarningrt)rRrrr__del__Ss  zfile_wrapper.__del__cGstj|jf|S)N)rr r>)rRr+rrrrrYszfile_wrapper.recvcGstj|jf|S)N)rr"r>)rRr+rrrrn\szfile_wrapper.sendNcCs(|tjkr|tjkr|sdStddS)Nrz-Only asyncore specific behaviour implemented.)rQrarNotImplementedError)rRlevelZoptnameZbuflenrrrrb_s   zfile_wrapper.getsockoptcCs(|jdkrdS|j}d|_t|dS)Nrr)r>rrt)rRr>rrrrtjs  zfile_wrapper.closecCs|jS)N)r>)rRrrrr`qszfile_wrapper.fileno)N) rrrrTrrrrnrbr r"rtr`rrrrrKs rc@seZdZdddZddZdS)file_dispatcherNcCsPt|d|d|_y |}Wntk r4YnX||t|ddS)NTF)rHrTrNr`AttributeErrorset_filer set_blocking)rRr>r;rrrrTvs  zfile_dispatcher.__init__cCs"t||_|j|_|dS)N)rrQr`rKr])rRr>rrrrs  zfile_dispatcher.set_file)N)rrrrTrrrrrrts r)r0N)r0N)rCFNN)NF).__doc__r%rQrur8rrerrnorrrrrrrr r r r r rrr,r1rr ExceptionrKeyboardInterrupt SystemExitrr r"r$r/r?rBZpoll3rGrHrrrrfrrrrrr/sB<    '  ,  )