Python脚本进行通信

时间:2014-02-11 05:24:18

标签: python multithreading

我正在尝试为像Tic-Tac-Toe或checkers / chess这样的游戏编写游戏管理器/控制器:

Game Arbiter:控制游戏的游戏玩法,并将对手的动作转发给每个玩家。还确定移动是否合法

GamePlayer.py

  • 在仲裁员提出要求时会采取行动

GameArbiter.py

  • 将决定哪个玩家先出现
  • 将决定移动是否合法
  • 将继续引用两名球员
  • 将要求正确的玩家进行移动并提供当前的游戏状态

我遇到的问题是仲裁者将如何与玩家沟通?我想使用PIPE.communicate(),但似乎只有在每个.communicate()请求之后Player终止时才有效。我的代码是这样的:

GameArbiter.py:

import subprocess
import sys

player1 = subprocess.Popen([sys.executable, "GamePlayer.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

instruction = "GetMove"
out, _ = player1.communicate(instruction.encode())
print(out.decode())     # process input from player

# do some stuff

instruction = "GetMove"
out, _ = player1.communicate(instruction.encode())
print(out.decode())     # process input from player

GamePlayer.py:

instruction = input()
if(instruction == "GetMove"):
    print("Bc4xc5")
else:
    print("InvalidInstruction")

当然第二次.communicate()python崩溃后,因为player1不再是一个打开的文件

我的问题是我如何写(在python中)一个可以与多个孩子异步地来回交谈的代表?

3 个答案:

答案 0 :(得分:1)

communicate是一个位于player1.stdin.writeplayer1.stdout.read之上的高级函数。有一种方法可以实现你想要做的事情,但这会给你的代码带来很多复杂性(你需要产生单独的线程来读取另一个进程的stdout,刷新等)。如果您想完成所有这些操作,可以查看communicate函数的源代码。

更标准的解决方案是使用客户端 - 服务器架构通过网络进行通信

答案 1 :(得分:1)

如果所有这一切都发生在一台机器上,那么我想知道你是否需要单独的流程。

如果目标是将播放器进程移动到单独的计算机上,那么我建议您在典型的客户端 - 服务器模型中使用进程之间的网络通信。在这种情况下,我会推荐Twisted

  

什么是扭曲?

     

Twisted是一个事件驱动的网络引擎,用Python编写,并在开源MIT许可下获得许可。

答案 2 :(得分:0)

为什么不让GamePlayer成为无限调用的函数?

或者更好的是,一个游戏中每个玩家都会从中继承的类。