У меня есть задача, которая должна принимать сообщения MSG (обычные строки) на внешнем интерфейсе, выполнять некоторую обработку и преобразовывать эти сообщения MSG в запросы HTTP, которые необходимо отправить на внутренний сервер.Таким образом, по существу есть две конечные точки - фронтенд - это обычный BSD-сокет.Backend - это соединение urllib.HTTP.Ответы идут обратным путем.Однако это не сценарий «запрос-ответ».Я мог бы иметь совершенно неупорядоченный тип асинхронного сценария req1-> req2-> resp2-> req4-> req3-> resp3-> resp1 ....Поэтому я не могу просто сделать:
msg = socketFrontEnd.recv()
... process msg and make 'Request'
resp, content = httpBackEnd.request("http://example.org", "PUT", body=Request)
... process resp and make 'Response'
socketFrontEnd.send(Response)
Мне нужно что-то более похожее на механизм опроса:
While(True):
readysockets = select(SocketFrontEnd, httpBackEnd)
if readysockets has SocketFrontEnd:
msg = socketFrontEnd.recv()
process and send request to httpBackEnd(...)
if readysockets has httpBackEnd:
resp = httpBackEnd(...)
process and send response to socketFrontEnd()
Однако, насколько мне известно, я не могу поставитьHTTP-соединение в каком-то утверждении выбора.Даже если бы это было возможно, как вы отдельно отправляете и получаете от httpconnection (вместо использования одной команды «http.request (..)»).
Что если я отправлю какой-нибудь ajax-запрос по httpconnection, будет ли выполнен этот обратный вызов в ajax-запросе, если я заблокирован на socketFrontEnd?То есть мы можем сделать что-то вроде:
while(True):
msg = socketFrontEnd.recv() <-- blocked
... process and make 'Request'
ajax('callback_function', Request, 'http://backendserver.com')
Callback_function(resp):
... process and make Response
socketFrontEnd.send(Response)