一、谁的开启速度快?
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 """