Python 线程和进程之间存在这种差异是否有原因?

Is there a reason for this difference between Python threads and processes?

当列表对象传递给 python (3.9) 进程和线程时,在 线程 中对列表对象所做的添加会在父进程中看到但不是在 过程 中完成的添加。例如,

from multiprocessing import Process
from threading import Thread


def job(x, out):
    out.append(f'f({x})')


out = []
pr = Process(target=job, args=('process', out))
th = Thread(target=job, args=('thread', out))
pr.start(), th.start()
pr.join(), th.join()
print(out)

这会打印 ['f(thread)']。我预计它是(无视顺序)['f(thread)', 'f(process)'].

谁能解释一下这是什么原因?

没什么Python-specific;这就是流程的工作方式。

具体来说,给定进程中的所有线程 运行 共享进程的 memory-space —— 例如如果线程 A 更改变量的状态,线程 B 将“看到”该更改。

进程,OTOH,每个进程都有自己的私有内存space,所有其他进程都无法访问。这样做是为了防止进程 A 意外(或故意)读取或破坏进程 B 的内存。

当您生成子进程时,新的子进程会获得自己的 memory-space,它最初包含父进程内存中所有数据的副本 space,但它是一个单独的 space,因此子项所做的更改将对父项不可见(和 vice-versa)。