Отправить объект сокета в разветвленный запущенный процесс (multiprocessing.Queue)

Я учусь использовать веб-сокеты HTML5, и в рамках этого я пишу сервер на Python, чтобы знать, как они работают. На днях я создал один, который работал довольно хорошо, но я хотел расширить его, чтобы он поддерживал несколько конечных точек, причем каждая конечная точка была отдельной «службой», которая может обрабатывать клиентов веб-сокетов.

На данный момент моя реализация работает с порождающими процессами и т. д. (я использую многопроцессорность вместо многопоточности, так как я читал, что многопоточность в CPython на самом деле не является многопоточностью, и я думаю, что это то, что я использую (установка по умолчанию в Ubuntu 12.04) ), но у меня возникают проблемы с отправкой полученных клиентских сокетов процессам службы.

Вот как я их отправляю (это происходит в цикле):

try:
    #get a new client
    conn, addr = server.accept()
    print "Client connected from", addr
    request = conn.recv(4096)
    response, close, service = self.handshake(request)
    conn.send(response)
    if close:
        print "Invalid request from", addr
        conn.close()
        continue
    client = WebSockets.WebSocketClient(conn, addr)
    service.clientConnQueue.put(client)

'сервер' - это сокет, прослушивающий входящие соединения. Метод рукопожатия заботится о проверке их запроса и определении того, в какой процесс службы поместить клиента. «response» — это HTTP-ответ для отправки, «close» — это True, если произошла ошибка, а «service» — это класс, наследуемый от multiprocessing.Queue. WebSocktes.WebSocketClient — это место, где хранится моя отправляющая и принимающая реализация, и оно в основном функционирует как оболочка для сокета.

'clientConnQueue' создается так:

class Service(multiprocessing.Process):
    """Base class for all services."""
    def __init__(self, manager):
        multiprocessing.Process.__init__(self)
        self.manager = manager
        self.clientConnQueue = self.manager.Queue()
        self.shutdownFlag = multiprocessing.Event()

менеджер многопроцессорный.Manager()

Ошибка, которую я получаю, когда пытаюсь поместить клиента в clientConnQueue, выглядит следующим образом:

File "./WebSocketServer.py", line 183, in <module>
main()
File "./WebSocketServer.py", line 180, in main
server.runServer()
File "./WebSocketServer.py", line 67, in runServer
service.clientConnQueue.put(client)
File "<string>", line 2, in put
File "/usr/lib/python2.7/multiprocessing/managers.py", line 758, in _callmethod
conn.send((self._id, methodname, args, kwds))
TypeError: expected string or Unicode object, NoneType found

Затем я получаю ошибку о разрыве канала на принимающей стороне.

Я получил ту же ошибку, когда использовал multiprocessing.Queue для отправки соединения, и я подумал, что изменение его на очередь, созданную менеджером, решит проблему. Однако, похоже, он делает ту же самую реализацию.

Очевидно, что это не тот способ, которым предполагается отправлять что-то подобное работающему процессу, так как же правильно отправлять несериализуемые объекты в процесс?

6
задан Los Frijoles 28 May 2012 в 18:18
поделиться