python - Django和Socket服务器: Can I add socket server instance to “memory” ?

标签 python django sockets

我正在与:

  • Django 1.11
  • Python套接字

  • 我有一个这样的套接字服务器:
    class SocketServer(threading.Thread):
    
        def __init__(self, ip="127.0.0.1", port=5000, _buffer=1024):
            super(RoomSocketServer, self).__init__()
            self.IP = ip
            self.PORT = port
            self.RECV_BUFFER = _buffer  # Advisable to keep it as an exponent of 2
            self.CONNECTION_LIST = []  # list of socket clients
            self.MESSAGE_QUEUES = {}  # List of message queue by socket
            self.OUTPUTS = []
            self.SERVER = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            # this has no effect, why ?
            self.SERVER.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.SERVER.bind((self.IP, self.PORT))
            self.SERVER.listen(10)
    
            # Add server socket to the list of readable connections
            self.CONNECTION_LIST.append(self.SERVER)
            self.ROOM = Room.objects.create(port=port, ip=ip, type_room=type_room)
    
        def read_sockets(self, read_sockets):
            ''' ... '''
    
        def write_sockets(self, write_sockets):
            ''' ... '''
    
        def error_sockets(self, error_sockets):
            ''' ... '''
    
        def run(self):
            while 1:
                # Get the list sockets which are ready to be read through select
                read_sockets, write_sockets, error_sockets = select.select(self.CONNECTION_LIST, self.OUTPUTS, [])
    
                # Read sockets
                self.read_sockets(read_sockets)
                self.write_sockets(write_sockets)
                self.error_sockets(error_sockets)
    
            self.SERVER.close()
    

    我可以在Django的任何地方运行这样的SocketServer(custom_command, View , celery ...):
    from socket_server import SocketServer
    
    socket_server = SocketServer()
    socket_server.start()
    # And the code continues while the socket server is running
    # I would like to save socket_server instance anywhere to access
    # Later from anywhere or trigger a signal to finish it
    

    就像我在上面说的那样,我想知道(如果可能的话)你们中的任何人将服务器实例保存到Django项目的不同部分来访问它吗?

    更新

    我尝试在Django上使用memcached,但是当我尝试将SocketServer实例存储在memcached上时,出现此错误:

    PicklingError: Can't pickle : attribute lookup thread.lock failed

    最佳答案

    答案是肯定的,而且很简单

    serverlst = dict()
    for x in range(0,5):
        tmp = SocketServer("",5000+x) # Note that you should change the port because each port can be listened only by one socket server
        tmp.start()
        serverlst[5000+x]=tmp
    
    或者您可以使用以下命令访问服务器套接字
    serverlst[5000].getName()   # returns the server socket with port 5000's thread
    
    循环后打印serverlst时,您可以看到此信息
    {5000: <SocketServer(Thread-5, started 139741574940416)>, 5001: <SocketServer(Thread-6, started 139741583333120)>, 5002: <SocketServer(Thread-7, started 139741658834688)>, 5003: <SocketServer(Thread-8, started 139741667227392)>, 5004: <SocketServer(Thread-9, started 139741233895168)>}
    
    或者您可以将其添加到list()更新
    对不起,我没看到

    I would like to know (if possible) where would any of you save the instance of the server to access it from different parts of the Django project


    我可以说这取决于您的发展方式,我认为这不是一个好主意。最好在线程和Django项目(例如redis)之间使用桥接器,该桥接器允许您保留数据并从整个系统访问数据,并且可以使用python redis client

    关于python - Django和Socket服务器: Can I add socket server instance to “memory” ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46618721/

    相关文章:

    python - Python 到 MYSQL 插入中遇到的问题

    python - prefetch_与 Django 1.5 + django-model-utils 相关

    django - 嵌套外键关系中的 Sum 和 Count?

    如果使用 4 参数版本但不使用 2 参数版本,java.net.Socket 构造函数会抛出 Socket 异常

    java socket收不到数据

    python - setup.py 从 bdist 中排除一些 python 文件

    python - 如果某个类(按字符串名称)存在,如何检查 python?

    python - Jinja2 Django Python groupby ('attribute' ) 自定义排序的石斑鱼

    c++ - 使用 RAW 套接字读取 ICMP 响应

    python - 返回 如果变量 = 0,则将 "change"更改为 : How do I remove a variable (dollars, 25 美分、一毛钱、镍币、便士)?