进程,是系统进行资源分配最小单位(拥有独立的内存单元)。(python中多进程是真的)
线程,是操作系统最小的执行单位(共享内存资源),比进程还小。(python中多线程是假的,因为cpython解释器中的一个模块GIL(全局解释器锁),GIl功能和互斥锁相似。)
证明过程:
(一)多进程
import multiprocessing import os import time def add2(): start_time = time.time() for i in range(100000000): pass end_time = time.time() use_time = end_time - start_time print("进程id: %s use_time: %s" % (os.getpid(), use_time)) if __name__ == '__main__': print("【进程测试】") p1 = multiprocessing.Process(target=add2, args=(), name="p1-进程") print("p1.name :%s" % p1.name) p2 = multiprocessing.Process(target=add2, args=(), name="p2-进程") start_time = time.time() p1.start() p2.start() p1.join() p2.join() end_time = time.time() use_time = end_time - start_time print("主进程id:%s use_time: %s" % (os.getpid(),use_time)) print("====主进程单独运行一次循环耗时:=====") add2()
多进程运行结果:
(二)多线程
import threading import time def add2(): start_time = time.time() for i in range(100000000): pass end_time = time.time() use_time = end_time - start_time print("线程id:%s 耗时:%s" % (threading.current_thread().ident, use_time)) if __name__ == '__main__': print("【线程测试】") print("主线程:%s 主线程id:%s" % (threading.current_thread(), threading.current_thread().ident)) t1 = threading.Thread(target=add2, args=(), name="t1-线程") t2 = threading.Thread(target=add2, args=(), name="t2-线程") start_time = time.time() t1.start() t2.start() t1.join() t2.join() end_time = time.time() use_time = end_time - start_time print("线程id:%s 耗时:%s (主线程)" % (threading.current_thread().ident, use_time)) print("====主线程单独运行一次循环耗时:=====") add2()
多进程运行结果:
(三)结论:
不论是线程还是进程,循环单独运行的时间都是差不多的4秒内。
而多线程的总耗时基本上是单独循环一次耗时的2倍左右,所以多线程是假的,是串行的。