import multiprocessingimport threadingimport time
n = 0
def count(num): global n for i in range(100000): n += i print("Process {0}:n={1},id(n)={2}".format(num, n, id(n)))
if __name__ == '__main__': start_time = time.time
process = list for i in range(5): p = multiprocessing.Process(target=count, args=(i,)) # 测试多进程使用 # p = threading.Thread(target=count, args=(i,)) # 测试多线程使用 process.Append(p)
for p in process: p.start
for p in process: p.join
print("Main:n={0},id(n)={1}".format(n, id(n))) end_time = time.time print("Total time:{0}".format(end_time - start_time))
- 结果
Process 1:n=4999950000,id(n)=139854202072440Process 0:n=4999950000,id(n)=139854329146064Process 2:n=4999950000,id(n)=139854202072400Process 4:n=4999950000,id(n)=139854201618960Process 3:n=4999950000,id(n)=139854202069320Main:n=0,id(n)=9462720Total time:0.03138256072998047变量n在进程p{0,1,2,3,4}和主进程(main)中均拥有唯一的地址空间

文章插图
什么是线程线程-也是操作系统提供的抽象概念,是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位 。一个进程可以有一个或多个线程,同一进程中的多个线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等 。但同一进程中的多个线程有各自的调用栈和线程本地存储(如下图所示) 。

文章插图
系统利用PCB来完成对进程的控制和管理 。同样,系统为线程分配一个线程控制块TCB(Thread Control Block),将所有用于控制和管理线程的信息记录在线程的控制块中,TCB中通常包括:
- 线程标志符
- 一组寄存器
- 线程运行状态
- 优先级
- 线程专有存储区
- 信号屏蔽
进程和线程之间有许多相似的地方,那它们之间到底有什么区别呢?

文章插图
进程 VS 线程
- 进程是资源的分配和调度的独立单元 。进程拥有完整的虚拟地址空间,当发生进程切换时,不同的进程拥有不同的虚拟地址空间 。而同一进程的多个线程是可以共享同一地址空间 。
- 线程是CPU调度的基本单元,一个进程包含若干线程 。
- 线程比进程小,基本上不拥有系统资源 。线程的创建和销毁所需要的时间比进程小很多
- 由于线程之间能够共享地址空间,因此,需要考虑同步和互斥操作
- 一个线程的意外终止会影响整个进程的正常运行,但是一个进程的意外终止不会影响其他的进程的运行 。因此,多进程程序安全性更高 。
总之,多进程程序安全性高,进程切换开销大,效率低;多线程程序维护成本高,线程切换开销小,效率高 。(Python的多线程是伪多线程,下文中将详细介绍)

文章插图
什么是协程协程(Coroutine,又称微线程)是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制 。协程与线程以及进程的关系见下图所示 。
- 协程可以比作子程序,但执行过程中,子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行 。协程之间的切换不需要涉及任何系统调用或任何阻塞调用
- 协程只在一个线程中执行,是子程序之间的切换,发生在用户态上 。而且,线程的阻塞状态是由操作系统内核来完成,发生在内核态上,因此协程相比线程节省线程创建和切换的开销
- 协程中不存在同时写变量冲突,因此,也就不需要用来守卫关键区块的同步性原语,比如互斥锁、信号量等,并且不需要来自操作系统的支持 。
推荐阅读
- 梦幻西游5开最好的组合是什么?
- 世界十大猛犬排名是怎样的?
- 智慧团建怎么转团关系?
- 专升本条件要求是什么?
- 可能存在生命的星系 星球本身是生命体
- 太阳将在约50亿年后成为什么 太阳将在约50亿年后成为哪一种星体
- 人有阴阳眼是真的吗? 阴阳眼能看到什么
- 金星为什么被称为金星 金星有生命信号
- 喝老寿眉的好处有哪些,有什么适合年轻人喝的茶
- 菊普什么人不能喝,紫罗兰花茶什么人不能喝
