【问题标题】:Handling socket process in a class in Python在 Python 中处理类中的套接字进程
【发布时间】:2015-07-02 15:49:27
【问题描述】:

我正在使用 Python 2.6 和新的套接字和线程。

我需要编写一个套接字代码来列出某些端口。以下是我相关的套接字类:

class SocketServer(object):
    """
    """
    def __init__(self, host, sock_port, buffsize=1024):
        self.hostname = host
        self.sock_port = sock_port
        self.buffsize = buffsize
        self.socket = None

    def start(self):
        print "Listening: "
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.socket.bind((self.hostname, self.sock_port))
        self.socket.listen(10)

        while True:
            conn, address = self.socket.accept()
            thread.start_new_thread(handle_data, (conn, self.buffsize))

if __name__ == "__main__":
    server = socketServer(ip, port)
    try:
        server.start()
    except Exception as e:
        print e

handle_data是监听相关端口的函数:

def handle_data(conn, buffsize):
    while True:
        try:
            _veri = conn.recv(buffsize)
            if not _veri:
                break
        except Exception as e:
            break
        # Do something else
    conn.close()

一切正常,但是handle_data 有一些很长的代码,所以我想把它写成一个类。

第一个问题是,我可以把它写成一个类吗?其次,在套接字侦听中对类进行线程化与对函数进行线程化有任何缺点(相当大的内存使用差异等)?

【问题讨论】:

  • 显然不是一个解决方案,但看看SocketServer 模块可能会有用:)

标签: python multithreading sockets python-2.6


【解决方案1】:

线程化类和线程化函数没有区别。

基本上,您将启动的每个线程都会运行一个函数。

然后,线程化一个类意味着编写一个具有入口点函数的类,该函数将管理您的实例。你只需要写:

thread.start_new_thread(myClassInstance.handle_data, (conn, self.buffsize))

唯一的区别是使用类,由于self 参数传递给您执行的每个方法调用,您的开销将非常低。 我认为在这一点上,你可以忽略它。

【讨论】:

  • myClassInstance 会派生自threading.Thread 吗?很抱歉提出这样的问题,但我对这个主题很陌生。
  • @FallenAngel 不,你不需要。在 Python 中,函数是一等公民。结果是instance.function 是一个绑定方法,可以在没有self 参数的情况下调用。为了说明我的意思,假设您有一个带有方法dance(self, time) 的类,为了调用它,您需要一个self 和一个time 参数。 self 是实例类。在 Python 中,self 参数是使用实例自动绑定的。因此,您只需提供time 参数。在这里,它是一样的。您的 handle_data self 参数绑定到 myClassInstance
猜你喜欢
  • 2011-08-26
  • 2018-11-20
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 2016-05-14
  • 1970-01-01
相关资源
最近更新 更多