<p>要直接回答您的问题,必须有<code>external_process</code>的一些副作用,这样当代码以系列方式运行时,您得到的结果与同时运行时的结果不同。这是由于您如何设置代码,以及在支持<code>os.fork</code>的系统中<code>os.fork</code>和<code>multiprocessing.Process</code>之间缺乏差异。</p>
<hr/>
<p><code>os.fork</code>和<code>multiprocessing.Process</code>之间唯一真正的区别是可移植性和库开销,因为在windows中不支持<code>os.fork</code>,并且包含<code>multiprocessing</code>框架来使<code>multiprocessing.Process</code>工作。这是因为<code>os.fork</code>由<code>multiprocessing.Process</code>调用,作为<a href="https://stackoverflow.com/a/2276366/786020">this answer</a>备份。</p>
<p>因此,重要的区别是<code>os.fork</code>使用Unix的forking复制当前进程中的所有内容,这意味着在forking时两个进程的PID差异是相同的。在Window s中,这是通过在<code>if __name__ == '__main__':</code>之前重新运行所有设置代码来模拟的,这与使用<code>subprocess</code>库创建子进程大致相同。</p>
<p>对您来说,您提供的代码片段执行的是完全不同的上述操作,因为在第二个代码片段中打开新进程之前,您在main中调用了<code>external_function</code>,使这两个进程在不同的进程中串联运行。此外,管道是不必要的,因为它没有从第一个代码中模拟任何功能。</p>
<p>在Unix中,代码片段:</p>
<pre><code>import os
pid = os.fork()
if pid == 0:
os.environ['HOME'] = "rep1"
external_function()
else:
os.environ['HOME'] = "rep2"
external_function()
</code></pre>
<p>以及:</p>
<pre><code>import os
from multiprocessing import Process
def f():
os.environ['HOME'] = "rep1"
external_function()
if __name__ == '__main__':
p = Process(target=f)
p.start()
os.environ['HOME'] = "rep2"
external_function()
p.join()
</code></pre>
<p>应该做完全相同的事情,但是附带的多处理库会有一些额外的开销。</p>
<hr/>
<p>如果没有进一步的信息,我们就无法找出问题所在。如果你能提供代码来演示这个问题,那将有助于我们帮助你。</p>