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

Python中基于os.fork()的父子进程通信与多任务实现问询

这是个挺实用的进程拆分方案——用os.fork()把持续更新任务和主服务拆开,既不阻塞父进程的核心逻辑,又能保证数据同步。我来给你落地这个思路,附上完整的实现代码和关键细节说明:

核心逻辑拆解

咱们先把整个流程捋清楚:

  • 子进程:启动后就进入循环,不断调用keep_updating_some_value_while_parent_is_running()更新目标值,每次更新后把值写入磁盘文件;同时定时检测父进程的Web服务是否可用,一旦检测失败就终止循环、退出。
  • 父进程:启动自己的Web广播服务(用来对外提供结果或者给子进程做存活检测),同时让子进程在后台独立运行,专注处理自身的核心业务逻辑。
完整代码实现

我用Python写了个可运行的示例,包含了所有核心逻辑:

import os
import time
import requests
from flask import Flask

app = Flask(__name__)
# 父进程的健康检查端点,给子进程用来判断父进程是否存活
@app.route('/health')
def health_check():
    return "OK", 200

def keep_updating_some_value_while_parent_is_running():
    # 模拟更新逻辑,这里可以替换成你的实际业务代码
    current_value = 0
    while True:
        current_value += 1
        print(f"子进程更新值: {current_value}")
        # 将值写入磁盘,父进程可以直接读取这个文件
        with open('/tmp/shared_value.txt', 'w') as f:
            f.write(str(current_value))
        time.sleep(2)  # 模拟更新间隔
        yield current_value

def child_process_task(parent_web_port=5000):
    health_url = f"http://localhost:{parent_web_port}/health"
    max_retry = 3
    retry_count = 0

    for _ in keep_updating_some_value_while_parent_is_running():
        try:
            # 请求父进程的健康检查端点,判断父进程是否存活
            response = requests.get(health_url, timeout=1)
            if response.status_code == 200:
                retry_count = 0  # 检测成功,重置重试计数器
            else:
                retry_count += 1
        except requests.exceptions.RequestException:
            retry_count += 1

        # 连续多次检测失败,认为父进程已退出,子进程终止
        if retry_count >= max_retry:
            print("子进程检测到父进程已退出,终止更新任务")
            # 可以在这里做一些资源清理工作
            break

if __name__ == "__main__":
    # 创建子进程
    pid = os.fork()

    if pid == 0:
        # 子进程分支:执行更新任务
        child_process_task()
        os._exit(0)  # 子进程退出,避免执行父进程的代码
    else:
        # 父进程分支:启动Web广播服务
        print(f"父进程启动,子进程PID: {pid}")
        try:
            app.run(host='0.0.0.0', port=5000, debug=False)
        finally:
            # 父进程退出时,杀掉子进程,避免孤儿进程
            print("父进程即将退出,终止子进程")
            os.kill(pid, 9)
关键细节说明
  • 进程分离与退出:os.fork()后,子进程返回0,父进程返回子进程的PID。子进程执行完任务后要用os._exit(0)直接退出,避免继承父进程的资源;父进程退出前要主动杀掉子进程,防止出现孤儿进程。
  • 磁盘数据同步:这里用了/tmp/shared_value.txt作为共享存储,父进程可以随时读取这个文件获取最新值。如果你的场景有高并发读需求,可以考虑加文件锁(比如fcntl模块)来避免读写冲突。
  • 父进程存活检测:子进程通过定时请求父进程的/health端点来判断存活状态,连续失败多次后终止。你可以根据实际需求调整检测间隔和重试次数。
  • Web服务选择:示例用Flask实现了简单的Web服务,你可以替换成任何你正在使用的Web框架(比如FastAPI、Django),只要保证有一个可访问的健康检查端点就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:19:13