【发布时间】:2018-11-17 11:35:39
【问题描述】:
我尝试与 Stockfish 通信(它是标准输入/标准输出应用程序)。
它是这样工作的:
- 我向标准输入发送了一些行。
- 它会立即响应一些行到标准输出中。
- 它可以连续响应下一行(新移动评估)。
- Stockfish 永远不会停止,所以
communicate()将无法工作,因为它不是它的设计者。add_reader在 Windows 中不起作用。
它正在连续发送不可预测的行数。
问题是当我调用await stdout.readline() 时它是否阻塞了程序流,因为我不想要阻塞流但检查是否读取新行来读取。如何在不阻塞的情况下读取行。
我做的一些代码 - 没什么复杂的:
import asyncio
import sys
def stockfish_read_stdout(line):
print(line)
async def run_stockfish():
STOCKFISH_PATH = r'C:\root\chess\stockfish\stockfish 9\stockfish_9_x64_bmi2.exe'
stockfish = await asyncio.subprocess.create_subprocess_exec(
STOCKFISH_PATH,
stdin=asyncio.subprocess.PIPE,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE)
# It is maybe not work since output is not complete.
stockfish.stdin.write('uci'.encode())
# How to check if line read to read?
# I put True but here should be check.
while True:
line = await stockfish.stdout.readline()
print(line)
await stockfish.wait()
if sys.platform == "win32":
asyncio.set_event_loop_policy(
asyncio.WindowsProactorEventLoopPolicy())
asyncio.run(run_stockfish(), debug=True)
输出是:
Win32 上的 Python 3.7.1(v3.7.1:260ec2c36a,2018 年 10 月 20 日,14:57:15)[MSC v.1915 64 位(AMD64)] runfile('C:/Users/Cezary Wagner/PycharmProjects/stockfish-proxy/sandbox/async_proxy/s01_async_stockfish.py', wdir='C:/Users/Cezary Wagner/PycharmProjects/stockfish-proxy/sandbox/async_proxy') b'Stockfish 9 64 BMI2,作者 T. Romstad、M. Costalba、J. Kiiski、G. Linscott\r\n'但应该在uci之后:
【问题讨论】:
-
应该
'uci'.encode()是'uci\n'.encode()还是更简单的b'uci\n'? -
可能是,但我不确定所以不是我不使用我会检查。
标签: python python-asyncio python-3.7