多线程之Openstack novnc 改造,缓解Nova压力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 #!/usr/bin/envpython #-*-coding:UTF-8-*- """ @Item:Socketlearing @Author:William @Group:DEVGroup @Date:2013-10-16 @Funtion: """ import sys,os,time,redis,traceback,json,threading,socket from cloud.hsnovnc import utils from cloud import log LOG = log.get_logger(__name__) class MySocket( object ): def __init__( self ,proto = 0 ): if proto = = 0 : self .sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) self .sock.setblocking( True ) else : self .sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) self .sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1 ) #Thesocketbindinghostandport def my_bind( self ,host,port): try : self .sock.bind((host,port)) except socket.error,e: LOG.error(e) return - 1 return 0 #listenTCPport,default def my_listen( self ,num = 1024 ): try : self .sock.listen(num) except socket.error,e: LOG.error(e) return - 1 return 0 #connectsettingtimeout def my_connect( self ,host,port,time_out = - 1 ): try : if time_out = = - 1 : self .sock.setblocking( 1 ) else : self .sock.settimeout(time_out) self .sock.connect((host,port)) except socket.error,e: LOG.error(e) return - 1 return 0 #acceptteturnclientaddress def my_accept( self ,time_out = - 1 ): addr = [] try : if time_out = = - 1 : self .sock.setblocking( 1 ) else : self .sock.settimeout(time_out) client_sock,addr = self .sock.accept() except socket.error,e: LOG.error(e) return client_sock,addr #recvsettingtimeout def my_recv( self ,buf_size,time_out = - 1 ): buf = '' try : if time_out = = - 1 : self .sock.setblocking( 1 ) else : self .sock.settimeout(time_out) buf = self .sock.recv(buf_size) except Exception,e: LOG.error(e) return buf #sendsettingtimeout def my_send( self ,buf,time_out = - 1 ): try : if time_out = = - 1 : self .sock.setblocking( 1 ) else : self .sock.settimeout(time_out) send_len = self .sock.send(buf) return send_len except Exception,e: LOG.error(e) return - 1 #close def my_close( self ,time_out = - 1 ): try : if time_out = = - 1 : self .sock.setblocking( 1 ) else : self .sock.settimeout(time_out) self .sock.close() except socket.error,e: LOG.error(e) return - 1 return 0 class sock_thread(threading.Thread): def __init__( self ,host,port,buf): threading.Thread.__init__( self ) self .host = host self .port = port self .buf = buf def run( self ): sock = MySocket() sock.my_bind( self .host, self .port) sock.my_listen( 20 ) LOG.info( 'Thesockethasbeenconnected' ) while True : conn,addr = sock.my_accept() while True : data = conn.recv( self .buf) if not data: break else : try : data = json.loads(data) if data[ 'Node' ][ 'UUID' ]: port = utils.get_vnc_port(data[ 'Node' ].get( 'UUID' , None )) data[ 'Node' ][ 'port' ] = port LOG.info(json.dumps(data)) conn.send(json.dumps(data)) else : conn.send() except : break conn.close() sock.my_close() class socket_demo( object ): def __init__( self ): host = utils.get_net_ip() self .host = host self .port = 10086 self .buf = 4096 def work( self ): self .sock = sock_thread( self .host, self .port, self .buf) self .sock.start() time.sleep( 0.5 ) def init(): st = socket_demo() st.work() 本文转自 swq499809608 51CTO博客,原文链接:http://blog.51cto.com/swq499809608/1540216