~~并发编程(九):多线程与多进程~~

进击のpython

*****

并发编程——多线程与多进程


本小节就一个要求

掌握在一个进程下开启多个子进程与在一个进程下开启多个线程的区别

开始操作


开启速度

在主进程中开启线程

from threading import Thread


def work():
    print('hello')


if __name__ == '__main__':
    for i in range(10):
        t = Thread(target=work)
        t.start()
    print('主线程/主进程')
        

可以发现执行的很快

在主进程中开启线进程

from multiprocessing import Process


def func():
    print('我是子进程')
    pass


if __name__ == '__main__':
    for i in range(10):
        p = Process(target=func)
        p.start()
    print('主进程')
    

相比较来说你会发现线程要更快

其实一想也是,开十个进程相当于十个进程+十个线程

那时间上指定要比十个线程要长


pid

在进程里查看pid

import os
from multiprocessing import Process


def func():
    print('我是子进程', os.getpid())
    pass


if __name__ == '__main__':
    for i in range(10):
        p = Process(target=func)
        p.start()
    print('主进程', os.getpid())

我们可以看到,因为是新开的进程,所以每个进程的id都不同

主进程 1516
我是子进程 6800
我是子进程 440
我是子进程 1840
我是子进程 7892
我是子进程 228
我是子进程 6464
我是子进程 4628
我是子进程 4944
我是子进程 4244
我是子进程 2300

在线程里查看pid

import os
from threading import Thread


def func():
    print('我是子进程', os.getpid())
    pass


if __name__ == '__main__':
    for i in range(10):
        p = Thread(target=func)
        p.start()
    print('主进程', os.getpid())

打印结果上可以看出,多线程的开启时基于一个进程开启

我是子进程 11228
我是子进程 11228
我是子进程 11228
我是子进程 11228
我是子进程 11228
我是子进程 11228
我是子进程 11228
我是子进程 11228
我是子进程 11228
我是子进程 11228
主进程 11228

数据共享

进程的数据

from multiprocessing import Process


def work():
    global n
    n = 0


if __name__ == '__main__':
    n = 100
    p = Process(target=work)
    p.start()
    p.join()
    print('主', n)

可以看到打印结果是 100

尽管在子进程里对全局变量中的n进行了修改,但是没有改变主进程里面的数据

所以可以说明,在进程中,数据是不互通的

线程的数据

from threading import Thread


def work():
    global n
    n = 0


if __name__ == '__main__':
    n = 100
    p = Thread(target=work)
    p.start()
    p.join()
    print('主', n)

可以看到打印结果是 0

在子线程里对全局变量中的n进行了修改,改变主进程里面的数据

所以可以说明,在线程中,数据是互通的


*****
*****
原文地址:https://www.cnblogs.com/jevious/p/11403965.html