Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在派生进程中读取OS环境变量_Python_Multiprocessing_Python Multiprocessing - Fatal编程技术网

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,))