gpt4 book ai didi

具有套接字+子进程的Python微服务

转载 作者:行者123 更新时间:2023-12-01 02:09:29 25 4
gpt4 key购买 nike

我正在使用 python 套接字和子进程来构建一个微服务:

  1. 将输入从套接字传递到 java 程序
  2. 从系统输出中获取结果并写回套接字

结果并不令人满意:当套接字请求太快时,会导致两个问题:

  1. 结果可能与输入的顺序不同
  2. 套接字可能不会自行关闭,并阻止 future 的请求。

下面是我的代码。关于如何改进它有什么想法吗?谢谢!

#Init the socket, bind to port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))

#Init the service as a subprocess
p = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE)

def clientthread(conn):
while True:
#waiting and accepting new input
data = conn.recv(1024)

#send the request to the subprocess
p.stdin.write(data)
p.stdin.flush()

#get the results and return it to the client
result = p.stdout.readline()
conn.sendall(result)
conn.close()

while 1:
conn, addr = s.accept()
start_new_thread(clientthread ,(conn,))

s.close()

最佳答案

您的代码存在一些问题:

  1. 您只创建了一个子进程,但每次获得新连接时,您都会启动一个新线程。然后所有线程都将输入传递给同一个子进程。他们都在竞赛,看看谁能为子流程提供下一位输入。然后比赛看谁能获得下一个结果。线程可能“输掉”输入竞赛,但“赢得”输出竞赛,因此它从子进程中获得的结果与输入不匹配。 (这可能解释了您的排序问题。)您要么需要为每个线程创建一个子进程,要么序列化对子进程的访问。

  2. 您假设您的输入数据(来自 conn.recv )将被完整接收。 TCP 不提供这样的保证。因此,如果您的输入超过一个字符,您将需要以某种方式累积数据(在“未到达输入结束”时循环)。

  3. 您假设您获取数据。如果您的客户端由于某种原因断开连接,您将从 conn.recv 获得 EOF(空字符串)。 。然后您将写入并刷新一个空字符串(零字节)到 p.stdin这是一个空操作。然后,您的子进程将永远等待(您的线程也会永远等待,因为它正在读取子进程的输出)。

  4. 您假设您从套接字收到的任何内容都足以作为您正在调用的子进程的完整输入,并且它会识别出这一点(您没有关闭其 stdin 所以它怎么知道?)。如果您知道自己收到了完整的输入,并且单个输入 block (单行或其他内容)始终是您的子流程所期望的,那么可能是有效的。

  5. 您假设子进程的输出仅生成一行 - 因为您只执行单个 readline .

  6. 您尚未检查子进程是否产生任何输出。如果没有,您将(再次)得到 EOF 和一个空字符串。然后,您将向 conn.sendall 提供一个空字符串。 (也是一个空操作)。

  7. 发送后,您将关闭与对等点 ( conn.close ) 的连接。但是,您不会退出无限循环,从而保证下次通过循环时会出现异常。

关于具有套接字+子进程的Python微服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48792049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com