Следующий код является частью некоторых автоматических тестов, которые я написал на python 3.6:
connected = False
def aiohttp_server(loop):
async def handler(msg, session):
global connected
if msg.type == sockjs.MSG_OPEN:
connected = True
if msg.type == sockjs.MSG_CLOSE:
connected = False
app = web.Application(loop=loop)
sockjs.add_endpoint(app, handler)
runner = web.AppRunner(app)
return runner
def run_server(runner, loop):
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(levelname)s %(message)s')
asyncio.set_event_loop(loop)
loop.run_until_complete(runner.setup())
site = web.TCPSite(runner, 'localhost', 8080)
loop.run_until_complete(site.start())
loop.run_forever()
def start_server():
loop = asyncio.new_event_loop()
t = threading.Thread(target=run_server, args=(aiohttp_server(loop),loop,), daemon=True)
t.start()
time.sleep(0.01)
По сути, вызов start_server должен инициировать простой веб-сервер с конечной точкой sockjs с именем /sockjs
Я пока не владею ключевым словом Python async
. Я подозреваю, что есть две проблемы:
Во-первых, я получаю предупреждение об устаревании оператора app = web.Application(loop=loop)
:
/home/peter/incubator/sockjs_client/tests/test_sockjs_client.py:25: DeprecationWarning: loop argument is deprecated
app = web.Application(loop=loop)
/home/peter/.local/lib/python3.6/site-packages/sockjs/route.py:54: DeprecationWarning: loop property is deprecated
manager = SessionManager(name, app, handler, app.loop)
И, во-вторых, тесты время от времени терпят неудачу. Я считаю, что, в зависимости от загрузки компьютера, иногда серверу не хватало времени для запуска, прежде чем тестовый код действительно начнет выполняться.
В принципе, мне нужно, чтобы функция start_server
инициализировала сеть. приложение с конечной точкой веб-сокета и не возвращать до тех пор, пока приложение не будет готово принимать подключения веб-сокета.