Python 在派生进程中读取OS环境变量
这类似于但适用于Python 在派生进程中读取OS环境变量,python,multiprocessing,python-multiprocessing,Python,Multiprocessing,Python Multiprocessing,这类似于但适用于多处理,而不是子流程。与子流程不同,在使用多处理时,动态更改pythonhasheed似乎没有效果: #check_environ.py import os, multiprocessing, subprocess, sys s = 'hello' print('parent', os.getenv('PYTHONHASHSEED'), hash(s)) if len(sys.argv) > 1: os.environ['PYTHONHASHSEED'] = s
多处理
,而不是子流程
。与子流程
不同,在使用多处理
时,动态更改pythonhasheed
似乎没有效果:
#check_environ.py
import os, multiprocessing, subprocess, sys
s = 'hello'
print('parent', os.getenv('PYTHONHASHSEED'), hash(s))
if len(sys.argv) > 1:
os.environ['PYTHONHASHSEED'] = sys.argv[1]
subprocess.call(['python', '-c', "import os;print('subprocess', os.getenv('PYTHONHASHSEED'), hash('{}'))".format(s)])
multiprocessing.Process(target=lambda:print('multiprocessing', os.getenv('PYTHONHASHSEED'), hash(s))).start()
运行示例:
# explicit PYTHONHASHSEED for subprocess/multiprocessing
$ python check_environ.py 12
parent None 4472558296122225349
subprocess 12 -8207222429063474615
multiprocessing 12 4472558296122225349
# random PYTHONHASHSEED for subprocess/multiprocessing
$ python check_environ.py
parent None 7990499464460966677
subprocess None 1081030409066486350
multiprocessing None 7990499464460966677
因此,无论如何,
多处理
哈希使用与父项相同的种子。有没有办法强制多处理产生的子进程使用不同的哈希种子?每个python
进程都是在新的操作系统环境中启动的,而在多处理
的情况下,只有一个进程是共享的,并从父进程继承。您可以使用“fork”以外的另一种启动方法来创建进程。您的操作系统正在使用fork(使用lambda作为目标不会得到PicklingError
)
您可以使用多处理将启动方法更改为“spawn”(Windows上的默认和唯一选项)。如果可用,请将启动方法(“spawn”)设置为“forkserver”。使用多处理获取所有可用方法。获取所有\u开始\u方法()
终端中的输出:
$ python check_environ.py 12
parent None 4279361553958749032
subprocess 12 -8207222429063474615
multiprocessing 12 -8207222429063474615
如果需要多次在开始方法之间切换,请使用上下文对象设置开始方法:
ctx = mp.get_context('spawn')
p = ctx.Process(target=foo, args=(var,))
但要准备好为使用除fork以外的另一种启动方法而付出巨大的时间代价。我刚刚在运行Ubuntu 18.04的机器上启动了一个python进程,并使用以下工具进行了基准测试:
- fork 1.59毫秒
- forkserver 289.83毫秒
- 产卵348.20毫秒
但这并不一定与您的用例相关。注意:如果您使用多处理.Pool
,而不是手动创建过程
对象,则惩罚应该更小;当然,创建池的成本仍然会更高,但是工作进程被许多任务重用,而不是每个任务一个新的派生进程。嗨@Darkonaut,我有一个关于在Windows笔记本电脑上运行多处理.pool
的问题。我希望你能花点时间来检查一下这个问题。非常感谢你的帮助!
ctx = mp.get_context('spawn')
p = ctx.Process(target=foo, args=(var,))