多线程之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/env python
#-*-coding:UTF-8-*-
"""
@Item : Socket learing
@Author : William
@Group : DEV Group
@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
)
# The socket binding host and port
def
my_bind(
self
, host, port):
try
:
self
.sock.bind((host, port))
except
socket.error, e:
LOG.error(e)
return
-
1
return
0
#listen TCP port ,default
def
my_listen(
self
, num
=
1024
):
try
:
self
.sock.listen(num)
except
socket.error, e:
LOG.error(e)
return
-
1
return
0
#connect setting timeout
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
#accept teturn client address
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
#recv setting timeout
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
#send setting timeout
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(
'The socket has been connected'
)
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()
|