You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将第二个进程生成的PID数据传递至持续运行的第一个进程?

进程间传递PID并处理的解决方案

要实现将第二个进程生成的Y.exe PID传递给无限运行的第一个进程,需要使用进程间通信(IPC)机制,Python的multiprocessing模块提供了Queue(队列)来安全传递数据,同时可以用Event确保服务器X先启动完成再启动Y.exe。

修改后的代码如下:

from subprocess import Popen, PIPE
from multiprocessing import Process, Queue, Event
import time

def firstproc(queue, ready_event):
    # 启动服务器X.exe
    process = Popen('X.exe', stdout=PIPE, text=True)  # text=True让输出为字符串而非字节
    # 标记服务器已启动完成
    ready_event.set()
    
    while True:
        # 读取X.exe的输出
        chunk = process.stdout.readline()
        if chunk:
            print(f"X.exe输出: {chunk.strip()}")
        
        # 检查队列中是否有新的PID需要处理
        while not queue.empty():
            pid = queue.get()
            # 这里添加你对PID的处理逻辑,比如打印、发送给X.exe等
            print(f"收到Y.exe的PID: {pid}")
        
        # 短暂休眠避免占用过多CPU
        time.sleep(0.1)

def secondproc(queue, ready_event):
    # 等待服务器X启动完成
    ready_event.wait()
    
    def getPID():
        proc = Popen('Y.exe')
        return proc.pid
    
    # 生成20个PID并放入队列
    for _ in range(20):
        pid = getPID()
        queue.put(pid)
        # 可选:如果Y.exe启动需要间隔,添加短暂休眠
        # time.sleep(0.05)

def main():
    # 创建进程间通信队列和同步事件
    pid_queue = Queue()
    server_ready = Event()
    
    p1 = Process(target=firstproc, args=(pid_queue, server_ready))
    p2 = Process(target=secondproc, args=(pid_queue, server_ready))
    
    p1.start()
    p2.start()
    
    # 等待子进程结束(可选,因为firstproc是无限运行,这里可以注释掉)
    # p1.join()
    # p2.join()

if __name__ == "__main__":
    main()

关键修改说明

  • Queue:作为两个进程间的消息传递容器,secondproc生成PID后放入队列,firstproc从队列中取出并处理,保证数据传递的安全性。
  • Event:实现进程同步,确保secondproc在X.exe完全启动后才开始启动Y.exe,避免服务器未就绪的问题。
  • 队列循环检查:在firstproc的无限循环中,每次读取X.exe输出后检查队列,确保不会遗漏任何PID。
  • text=True:将Popen的输出转为字符串,简化字节数据的处理流程。

内容的提问来源于stack exchange,提问作者Alexander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 10:26:04