(三)多线程之多线程与多进程的区别

一、谁的开启速度快?


1,在主进程下开启子进程

import time
from multiprocessing import Process

def say_hi(name):
    print('%s say hi!' % name)
    time.sleep(2)
    print('%s say hello!' % name)

if __name__ == '__main__':
    p = Process(target=say_hi,args=('zixi',))
    p.start()
    print('主线程')

"""
主线程
zixi say hi!
zixi say hello!
"""
开进程

p.start () 将开启进程的信号发给操作系统后,操作系统要申请内存空间,好让父进程地址空间拷贝到子进程,开销远大于线程。

2,在主进程下开启线程

import time
from threading import Thread

def say_hi(name):
    print('%s say hi!' % name)
    time.sleep(2)
    print('%s say hello!' % name)

if __name__ == '__main__':

    t = Thread(target=say_hi,args=('zixi',))
    t.start()

    print('主线程')

"""
zixi say hi!
主线程
zixi say hello!
"""
开线程

几乎是 t.start () 的同时就将线程开启了,然后先打印出了zixi say hi!,证明线程的创建开销极小。

二、同一进程内的多个线程共享该进程的数据


1,进程之间的地址空间是隔离的

from multiprocessing import Process

n = 100

def task():
    global n
    n = 0

if __name__ == '__main__':
    p = Process(target=task,)
    p.start()
    p.join()

    print('主线程',n)

# 主线程 100

毫无疑问子进程 p 已经将自己的全局的 n 改成了0,但改的仅仅是它自己的,查看父进程的 n 仍然为100。

2,同一进程内开启的多个线程是共享该进程地址空间的

from threading import Thread

n = 100

def task():
    global n
    n = 0

if __name__ == '__main__':
    t = Thread(target=task,)
    t.start()
    t.join()

    print('主线程',n)

# 主线程 0

查看结果为 0,因为同一进程内的线程之间共享进程内的数据。

三、看一下 pid


1,开多个进程,每个进程都有不同的 pid

from multiprocessing import Process
import os

def task():
    print("子进程PID:%s    父进程PID:%s" % (os.getpid(),os.getppid()))

if __name__ == '__main__':
    p1 = Process(target=task,)
    p2 = Process(target=task,)
    p1.start()
    p2.start()

    print('主线程',os.getpid())

"""
主线程 11256
子进程PID:1416    父进程PID:11256
子进程PID:18872    父进程PID:11256
"""

2,在主进程下开启多个线程,每个线程都跟主进程的 pid 一样

from threading import Thread
import os

def task():
    print("线程PID:%s" % (os.getpid()))

if __name__ == '__main__':
    t1 = Thread(target=task,)
    t2 = Thread(target=task,)
    t1.start()
    t2.start()

    print('主线程',os.getpid())

"""
线程PID:10288
线程PID:10288
主线程 10288
"""

猜你喜欢

转载自www.cnblogs.com/zoling7/p/13386535.html