python - python 中的进程是否有自己的 os.environ 副本?
问题描述
我想知道,python 中的进程是否有自己的副本os.environ
?即os.environ
从进程中设置是否安全,是否保证不会被另一个进程覆盖?
import os
import time
import random
from multiprocessing import Process
def f1(i):
time.sleep(random.randint(0,3))
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ['CUDA_VISIBLE_DEVICES'] = str(i)
print('i:', i)
time.sleep(random.randint(0, 3))
print('i:', i, "os.environ['CUDA_VISIBLE_DEVICES']", os.environ['CUDA_VISIBLE_DEVICES'])
def run_me():
n = 3
process_list = []
for i in range(n):
p = Process(target=f1, args=(i,))
p.start()
process_list.append(p)
for p in process_list:
p.join()
if __name__ == "__main__":
run_me()
输出示例:
i: 2
i: 0
i: 0 os.environ['CUDA_VISIBLE_DEVICES'] 0
i: 2 os.environ['CUDA_VISIBLE_DEVICES'] 2
i: 1
i: 1 os.environ['CUDA_VISIBLE_DEVICES'] 1
解决方案
不允许任何进程修改另一个进程的环境变量,并且每个进程都有自己的环境变量的新副本。除非另有说明,否则它将最初包含父进程的环境变量的副本。
推荐阅读
- javascript - 无论如何,容器 div 都不会占用 100% 的高度
- python - 如何修复字典值重新定义而不改变另一个列表的值?
- php - 使用 git 拉取生产
- reactjs - 如何在反应中将数据插入firestore时增加id(doc)?
- math - 基于附近点的点的平均高度
- azure - 集成 Azure Function、服务总线和 SignalR
- go - 我不明白返回函数的结果
- android - SQLite 没有立即插入记录
- node.js - Azure Bot 已部署但无法工作错误,因为 Invalid AppId 传递了令牌
- c# - 如何:在爱普生热敏打印机上进行独立 C# 打印