代码之家  ›  专栏  ›  技术社区  ›  scribe

Python线程和进程之间的这种差异有什么原因吗?

  •  0
  • scribe  · 技术社区  · 4 年前

    当列表对象被传递给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)'] .

    有人能解释一下原因吗?

    1 回复  |  直到 4 年前
        1
  •  1
  •   Jeremy Friesner    4 年前

    它没有什么Python的特色;这就是过程的工作原理。

    具体来说,在给定进程内运行的所有线程都共享该进程的 存储空间 --例如,如果线程A改变了变量的状态,线程B就会“看到”这种变化。

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

    生成子进程时,新的子进程将获得自己的内存空间,该内存空间最初包含父进程内存空间中所有数据的副本,但它是一个单独的空间,因此子进程所做的更改对父进程不可见(反之亦然)。