多线程之Openstack novnc 改造,缓解Nova压力

#!/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()

多线程之Openstack novnc 改造,缓解Nova压力,布布扣,bubuko.com

时间: 2024-11-19 21:34:31

多线程之Openstack novnc 改造,缓解Nova压力的相关文章

OC多线程之GCD ----- 2

dispatch_create生成的Queue不管是并行队列还是串行队列,其优先级都是默认优先级 但是可以用dispatch_set_target_queue来改变队列的优先级 dispatch_set_target_queue(原来的队列, 目标优先级队列) 使用这个函数需要获取两个队列,一个是需要变更优先级的队列,一个是指定优先级的队列(指定优先级的队列可以通过get_global获得) 如果多个串行队列优先级相同,那么这些队列里的任务也会串行执行 dispatch_after函数并不能非常

JAVA多线程之wait/notify

本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait() 与  notify/notifyAll() 的执行过程 ③中断 调用wait()方法进入等待队列的 线程 ④notify 通知的顺序不能错 ⑤多线程中测试某个条件的变化用 if 还是用 while? ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 wait()

多线程之AutoResetEvent

我们在线程编程的时候往往会涉及到线程的通信,通过信号的接受来进行线程是否阻塞的操作. AutoResetEvent 允许线程通过发信号互相通信.通常,此通信涉及线程需要独占访问的资源. AutoResetEvent 的方法有很多,具体方法和扩展方法请详见AutoResetEvent类,最常用方法中就有Set()和WaitOne(). 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号.如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的

Java多线程之wait(),notify(),notifyAll()

在多线程的情况下,因为同一进程的多个线程共享同一片存储空间,在带来方便的同一时候,也带来了訪问冲突这个严重的问题.Java语言提供了专门机制以解决这样的冲突,有效避免了同一个数据对象被多个线程同一时候訪问. wait与notify是java同步机制中重要的组成部分.结合与synchronizedkeyword使用,能够建立非常多优秀的同步模型. synchronized(this){ }等价于publicsynchronized void method(){.....} 同步分为类级别和对象级别

java多线程之ThreadLocal

ThreadLocal保证数据同步 package Thread.Common; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; class Accessor implements Runnable { private final int id; pub

python 线程之 threading(三)

python 线程之 threading(一)http://www.cnblogs.com/someoneHan/p/6204640.html python 线程之 threading(二)http://www.cnblogs.com/someoneHan/p/6209240.html 使用threading.Thread.is_alive()这个方法可以判断线程是否是存活状态.但是在现有的基础上不能够直到线程什么时候开始,什么时候结束,什么时候被打断. 如果有一个或者多个线程需要在另外的一个线

java多线程之Future和FutureTask

Executor框架使用Runnable 作为其基本的任务表示形式.Runnable是一种有局限性的抽象,然后可以写入日志,或者共享的数据结构,但是他不能返回一个值. 许多任务实际上都是存在延迟计算的:执行数据库查询,从网络上获取资源,或者某个复杂耗时的计算.对于这种任务,Callable是一个更好的抽象,他能返回一个值,并可能抛出一个异常.Future表示一个任务的周期,并提供了相应的方法来判断是否已经完成或者取消,以及获取任务的结果和取消任务. public interface Callab

多线程之pthread, NSThread, NSOperation, GCD

关于多线程会有一系列如下:多线程之概念解析 多线程之pthread, NSThread, NSOperation, GCD 多线程之NSThread 多线程之NSOperation 多线程之GCD pthread:跨平台,适用于多种操作系统,可移植性强,是一套纯C语言的通用API,且线程的生命周期需要程序员自己管理,使用难度较大,所以在实际开发中通常不使用. NThread:是苹果对pthread的一个封装.通过封装可以在Cocoa环境中,可以更简易地用多线程.线程的生命周期由程序员管理.每个N

python 线程之 threading(四)

python 线程之 threading(三) http://www.cnblogs.com/someoneHan/p/6213100.html中对Event做了简单的介绍. 但是如果线程打算一遍一遍的重复通知某个事件.应该使用Condition 1. 使用Condition首先应该获取Condition即使Condition进入锁的状态 2. 在线程执行过程中需要等待其他线程通知,然后才开始向下运行的地方使用Condition.wait()方法,线程进入阻塞状态. 3. 使用Condition