U ,a~N@shdZddlZddlZddlZddlZddlZddlZddlmZm Z m Z m Z m Z m Z mZmZmZmZmZmZmZee e eeeehZzeWnek 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 CsHz t|WStttfk rB|tkr6t|YSd|YSXdS)NzUnknown error %s)osstrerror ValueError OverflowError NameErrorr)errr-/opt/alt/python38/lib64/python3.8/asyncore.py _strerrorDs   rc@s eZdZdS)ExitNowN)__name__ __module__ __qualname__rrrrrLsrcCs:z |Wn(tk r"Yn|YnXdSN)handle_read_event_reraised_exceptions handle_errorobjrrrreadQs  r"cCs:z |Wn(tk r"Yn|YnXdSr)handle_write_eventrrr rrrwriteYs  r$cCs:z |Wn(tk r"Yn|YnXdSr)handle_expt_eventrrr rrr _exceptionas  r&c CszX|tj@r||tj@r&||tj@r8||tjtjBtj B@rV| Wnht k r}z$|j dt kr|n| W5d}~XYn(tk rYn|YnXdSNr)selectPOLLINrPOLLOUTr#POLLPRIr%ZPOLLHUPZPOLLERRZPOLLNVAL handle_closeOSErrorargs _DISCONNECTEDrr)r!flagserrr readwriteis"     r2c Cs<|dkr t}|r8g}g}g}t|D]L\}}|}|}|rP|||rd|jsd|||sl|r*||q*g|kr|kr|krnnt|dSt ||||\}}}|D] }| |}|dkrqt |q|D]"}| |}|dkrqt |q|D]&}| |}|dkr,qt |qdSr) socket_maplistitemsreadablewritableappend acceptingtimesleepr(getr"r$r&) timeoutmaprwr1fdr!Zis_rZis_wrrrpoll}sD    "        rCcCs|dkr t}|dk r t|d}t}|rt|D]L\}}d}|r\|tjtjBO}| rt|j st|tj O}|r8| ||q8||}|D]&\}}| |}|dkrqt||qdS)Nir)r4intr(rCr5r6r7r)r+r8r:r*registerr=r2)r>r?ZpollsterrBr!r0r@rrrpoll2s(     rF>@FcCsb|dkr t}|r ttdr t}nt}|dkr>|r^|||q,n |r^|dkr^||||d}q>dS)NrCr)r4hasattrr(rFrC)r>Zuse_pollr?countZpoll_funrrrloops  rKc@s2eZdZdZdZdZdZdZdZe dhZ dAddZ ddZ dBdd Z dCd d Zejejfd d ZdDddZddZddZddZddZddZddZddZddZd d!Zd"d#Zd$d%ZdEd'd(Zd)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|_z||_Wqtk r}z*|j dt t fkrvd|_n | |W5d}~XYqXnd|_ dSNrTF)r4_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 rz|d|jWn$tk r|t|jYnXdd |t |fS)N.Z listeningrSz%s:%dz <%s at %#x> ) __class__rrr:rTr9rS TypeErrorreprjoinid)rWZstatusrrr__repr__s    zdispatcher.__repr__cCs|dkr|j}|||j<dSr)rOrP)rWr?rrr add_channel szdispatcher.add_channelcCs,|j}|dkr|j}||kr"||=d|_dSr)rPrO)rWr?rBrrrrUs zdispatcher.del_channelcCs.||f|_t||}|d||dSr')Zfamily_and_typerVrQrR)rWZfamilytyperXrrr create_sockets   zdispatcher.create_socketcCs||_||_||dSr)rVfilenorPrbrWrXr?rrrrRs zdispatcher.set_socketcCsDz*|jtjtj|jtjtjdBWntk r>YnXdS)NrH)rVZ setsockopt SOL_SOCKETZ SO_REUSEADDR getsockoptr-rWrrrset_reuse_addr#s zdispatcher.set_reuse_addrcCsdSNTrrirrrr74szdispatcher.readablecCsdSrkrrirrrr87szdispatcher.writablecCs(d|_tjdkr|dkrd}|j|S)NTnt)r:rnamerVlisten)rWZnumrrrro>szdispatcher.listencCs||_|j|Sr)rTrVbind)rWrTrrrrpDszdispatcher.bindcCspd|_d|_|j|}|tttfks8|tkrBtj dkrB||_ dS|dt fkr^||_ | nt |t|dS)NFTrlr)rS connectingrVZ connect_exrrrrrrnrTr handle_connect_eventr-r)rWZaddressrrrrconnectHs   zdispatcher.connectc Csvz|j\}}WnVtk r(YdStk rh}z$|jdtttfkrVWY dSW5d}~XYn X||fSdSr')rVacceptr]r-r.rr r )rWZconnrTwhyrrrrtVs zdispatcher.acceptc Cstz|j|}|WStk rn}z>|jdtkrz:uncaptured python exception, closing channel %s (%s:%s %s)error)compact_tracebackr^r`rr,)rWZniltvtbinfoZ self_reprrrrrs  zdispatcher.handle_errorcCs|dddS)Nz!unhandled incoming priority eventrMrrirrrrszdispatcher.handle_exptcCs|dddS)Nzunhandled read eventrMrrirrrrszdispatcher.handle_readcCs|dddS)Nzunhandled write eventrMrrirrrrszdispatcher.handle_writecCs|dddS)Nzunhandled connect eventrMrrirrrrszdispatcher.handle_connectcCs|}|dk r|j|dSr)rthandle_accepted)rWZpairrrrrszdispatcher.handle_acceptcCs||dddS)Nzunhandled accepted eventrM)r{r)rWrXrTrrrrszdispatcher.handle_acceptedcCs|dd|dS)Nzunhandled close eventrM)rr{rirrrr,s zdispatcher.handle_close)NN)N)N)N)r),rrrdebugrSr:rqclosingrT frozensetrrYrarbrUrVZAF_INETZ SOCK_STREAMrdrRrjr7r8rorprsrtrvrzr{rrrrrr#r%rrrrrrrr,rrrrrLsJ         rLc@s6eZdZd ddZddZddZdd Zd d ZdS) dispatcher_with_sendNcCst|||d|_dS)Nry)rLrY out_bufferrfrrrrYszdispatcher_with_send.__init__cCs.d}t||jdd}|j|d|_dS)Nri)rLrvr)rWZnum_sentrrr initiate_sendsz"dispatcher_with_send.initiate_sendcCs |dSr)rrirrrrsz!dispatcher_with_send.handle_writecCs|j pt|jSr)rSlenrrirrrr8szdispatcher_with_send.writablecCs0|jr|dt||j||_|dS)Nz sending %s)rrr^rr)rWrwrrrrv s zdispatcher_with_send.send)NN)rrrrYrrr8rvrrrrrs  rcCst\}}}g}|std|rL||jjj|jjjt|j f|j }q~|d\}}}d dd|D}|||f|||fS)Nztraceback does not existr[cSsg|] }d|qS)z [%s|%s|%s]r).0xrrr &sz%compact_traceback..) r|exc_infoAssertionErrorr9tb_framef_code co_filenameco_namer~ tb_linenotb_nextr_)rrtbrfileZfunctionlinerrrrrsrc Cs|dkr t}t|D]n}z |Wqtk r`}z|jdtkrJn|sPW5d}~XYqtk rtYq|sYqXq|dSr') r4r5valuesr{r-r.r rclear)r?Z ignore_allrrrr close_all)s   rposixc@sNeZdZddZddZddZddZdd d ZeZeZ d d Z ddZ d S) file_wrappercCst||_dSr)rduprBrWrBrrrrYNszfile_wrapper.__init__cCs*|jdkrtjd|t|d|dS)Nrzunclosed file %r)source)rBwarningswarnResourceWarningr{rirrr__del__Qs   zfile_wrapper.__del__cGstj|jf|Sr)rr"rBrWr.rrrrzWszfile_wrapper.recvcGstj|jf|Sr)rr$rBrrrrrvZszfile_wrapper.sendNcCs(|tjkr|tjkr|sdStddS)Nrz-Only asyncore specific behaviour implemented.)rVrgrNotImplementedError)rWlevelZoptnameZbuflenrrrrh]s zfile_wrapper.getsockoptcCs(|jdkrdS|j}d|_t|dS)Nrr)rBrr{rrrrr{hs  zfile_wrapper.closecCs|jSr)rBrirrrreoszfile_wrapper.fileno)N) rrrrYrrzrvrhr"r$r{rerrrrrIs rc@seZdZdddZddZdS)file_dispatcherNcCsPt|d|d|_z |}Wntk r4YnX||t|ddS)NTF)rLrYrSreAttributeErrorset_filer set_blocking)rWrBr?rrrrYts  zfile_dispatcher.__init__cCs"t||_|j|_|dSr)rrVrerPrbrrrrrs  zfile_dispatcher.set_file)N)rrrrYrrrrrrrs r)r3N)r3N)rGFNN)NF).__doc__r(rVr|r;rrerrnorrrrrrrr r r r r rrr/r4rr ExceptionrKeyboardInterrupt SystemExitrr"r$r&r2rCrFZpoll3rKrLrrrrnrrrrrrsD<    '  *  )