Я учусь использовать веб-сокеты 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 для отправки соединения, и я подумал, что изменение его на очередь, созданную менеджером, решит проблему. Однако, похоже, он делает ту же самую реализацию.
Очевидно, что это не тот способ, которым предполагается отправлять что-то подобное работающему процессу, так как же правильно отправлять несериализуемые объекты в процесс?