【发布时间】:2019-07-11 15:24:25
【问题描述】:
我是 asyncio 的新手,我正在尝试制作一个简单的网络服务器,该服务器在收到请求后会计算国际象棋移动并将结果作为响应返回。问题是,该进程被阻塞,使得网络服务器在评估时无法监听和响应请求。我觉得我非常接近,但无法弄清楚接下来的几个步骤以使其正常工作。我已经让国际象棋引擎使用另一个脚本在几个不同的线程中运行,现在我只需要知道如何将它集成到一个简单的 Web 服务器中。对此的任何帮助将不胜感激。这是我的代码:
import asyncio
from aiohttp import web
import chess.engine
from concurrent.futures import ThreadPoolExecutor
import json
engine = chess.engine.SimpleEngine.popen_uci("/usr/games/stockfish")
executor = ThreadPoolExecutor(max_workers=3)
def play():
global engine
fen = "rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2"
print(fen)
board = chess.Board(fen)
result = engine.play(board,chess.engine.Limit(time=15.0))
return result
async def run_blocking_task(executor):
loop = asyncio.get_event_loop()
result = await loop.run_in_executor(executor, play)
return result
async def hello(request):
result = await run_blocking_task(executor)
return web.Response(text=str(result.move))
app = web.Application()
app.add_routes([web.get('/', hello)])
loop = asyncio.get_event_loop()
handler = app.make_handler()
f = loop.create_server(handler, '0.0.0.0', 8080)
srv = loop.run_until_complete(f)
print('serving on', srv.sockets[0].getsockname())
try:
loop.run_forever()
except KeyboardInterrupt:
pass
finally:
loop.run_until_complete(handler.finish_connections(1.0))
srv.close()
loop.run_until_complete(srv.wait_closed())
loop.run_until_complete(app.finish())
loop.close()
【问题讨论】:
标签: python python-3.x python-asyncio