Python:在分叉的孩子和父母之间共享变量

Posted

技术标签:

【中文标题】Python:在分叉的孩子和父母之间共享变量【英文标题】:Python: Share variable between forked child and parent 【发布时间】:2020-01-27 09:28:09 【问题描述】:

我是 Python 的初学者,在父脚本和分叉子脚本之间共享变量时遇到问题。

objectif如下

主脚本必须从 API 调用中获取任务并在子进程中运行它们。然后它会减少可用 CPU 的计数器以避免资源饱和,并在有可用 CPU 时获取新任务。我还想在子进程完成时增加计数器,但我无法让它工作。

这是我的脚本主要功能

def main():
    while True:
        global availables_cpu

        print("Got %s availables CPU requesting new job" % availables_cpu)
        response = requests.get("http://" + url_api + "/api.php?action=get&ressources=" + str(availables_cpu))
        data = json.loads(response.text)
        job_path = data["hash"]

        if job_path is None :
            print("Nothing to do, waiting for a while")

        else:
            dir = job_path.rstrip()

        if int(data["cpu"]) <= availables_cpu:
            availables_cpu -= int(data["cpu"])
            newpid = os.fork()

        if newpid == 0:
            code = child()
            availables_cpu += int(data["cpu"])
            os._exit(code)
        else:

            time.sleep(3)
            print("Parent")

child() 函数只是获取数据并在子进程中运行脚本

我不确定执行此操作的最佳方法,我愿意接受任何建议。

【问题讨论】:

每个进程都在自己的内存空间中运行,所以不能共享变量,因为没有共享内存。 我认为这是你需要的docs.python.org/3.7/library/…,请注意关于非原子增量的警告。 【参考方案1】:

正如@polku multiprocessing.Value 所建议的那样效果很好

通过这些修改

availables_cpu = multiprocessing.Value('I',psutil.cpu_count())

并将所有出现的availables_cpu 替换为availables_cpu.value

【讨论】:

以上是关于Python:在分叉的孩子和父母之间共享变量的主要内容,如果未能解决你的问题,请参考以下文章

如何为父母声明孩子是Qt中的共享指针

在一个父母中分叉多个孩子

python3 - 使用脚本从父级到子级共享变量的最简单方法

C: 多个分叉

在C程序之间共享变量值[重复]

辅助库可以用于在不相关的进程(不是分叉的进程)之间共享接受的连接吗?