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)。
当列表对象传递给 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)。