【问题标题】:Django & Socket Server: Can I add socket server instance to "memory"?Django 和套接字服务器:我可以将套接字服务器实例添加到“内存”吗?
【发布时间】:2018-03-19 00:38:05
【问题描述】:

我正在合作:

  • Django 1.11
  • Python 套接字

我有一个这样的 Socket 服务器:

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(自定义命令、视图、芹菜...):

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 : 属性查找 thread.lock 失败

【问题讨论】:

  • 好问题,您的域中的服务器用于什么或服务器后面是什么?
  • Django-Channels 使用 Redis。也许 Channels 是更简单的解决方案?
  • 感谢您的 cmets,我会检查 Django-Channels。现在我只是用 manage.py runserver 检查本地,但后来我想我会让 apache 或 nginx 作为 web 服务器运行
  • @AlvaroAV,您找到解决方案了吗?我还在运行一个 django 应用程序,它使用 ssl 套接字与固件连接,使用 Django rest 框架进行 UI 连接。我也很困惑在 Django 文件中添加什么以便启动套接字服务器。

标签: python django sockets


【解决方案1】:

答案是肯定的,很简单

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()

更新

抱歉没看到

我想知道(如果可能的话)你们中的任何人会将服务器实例保存在哪里,以便从 Django 项目的不同部分访问它

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

【讨论】:

    猜你喜欢
    • 2021-08-30
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2018-06-10
    • 2011-03-21
    • 1970-01-01
    • 2014-01-13
    相关资源
    最近更新 更多