新建 : 创建一个进程,获取资源的过程
终止 : 进程结束,释放资源的过程
线程与进程的区别可以归纳为以下4点:
对比维度 | 多进程 | 多线程 | 总结 |
---|---|---|---|
数据共享、同步 | 数据共享复杂,同步简单 | 数据共享简单,同步复杂 | 各有优劣 |
内存、CPU | 占用内存多,切换复杂,CPU利用率低 | 占用内存少,切换简单,CPU利用率高 | 线程占优 |
创建、销毁、切换 | 复杂,速度慢 | 简单,速度快 | 线程占优 |
编程、调试 | 编程简单,调试简单 | 编程复杂,调试复杂 | 进程占优 |
可靠性 | 进程间不会互相影响 | 一个线程挂掉将导致整个进程挂掉 | 进程占优 |
分布式 | 适用于多核、多机,扩展到多台机器简单 | 适合于多核 | 进程占优 |
进程与线程总结
"""
multiprocessing
1.将需要新进程执行的事件封装为函数
2 .通过模块的Process类创建进程对象,关联函数
3 .通过进程对象调用start启动进程
4 .通过进程对象调用join回收进程资源
"""
import multiprocessing as mp
from time import sleep
a = 1
# 进程函数
def fun():
global a
print("开始一个进程")
sleep(2)
a = 1000
print("a = ",a)
print("进程结束了,实际也没干啥")
if __name__ == '__main__':
# 创建进程对象
p = mp.Process(target=fun) # 绑定函数 此时还没有创建进程
# start启动进程 自动执行fun函数,作为一个进程执行
p.start() # 此时进程才产生
print("原有进程也干点事")
sleep(3)
print("原有进程其实也没干啥")
# 回收进程
p.join()
print("a :",a) # a = 1
"""
threading 创建线程演示
"""
from threading import Thread
from time import sleep
import os
a = 1 # 全局变量
# 线程函数
def music():
for i in range(3):
sleep(2)
print(os.getpid(),"播放:黄河大合唱")
global a
print("a =",a)
a = 1000
# 创建线程对象
t = Thread(target=music)
t.start() # 启动线程 执行music
for i in range(4):
sleep(1)
print(os.getpid(),"播放:葫芦娃")
t.join() # 回收线程资源
print("a:",a)"""
threading 创建线程演示
"""
from threading import Thread
from time import sleep
import os
a = 1 # 全局变量
# 线程函数
def music():
for i in range(3):
sleep(2)
print(os.getpid(),"播放:黄河大合唱")
global a
print("a =",a)
a = 1000
# 创建线程对象
t = Thread(target=music)
t.start() # 启动线程 执行music
for i in range(4):
sleep(1)
print(os.getpid(),"播放:葫芦娃")
t.join() # 回收线程资源
print("a:",a)
"""
孤儿进程和僵尸进程演示
"""
from multiprocessing import Process
from time import sleep
import os
from signal import *
def fun():
print("这是一个子进程",os.getppid(),'---',os.getpid())
sleep(3)
print("注定成为孤儿进程", os.getppid(), '---', os.getpid())
if __name__ == '__main__':
signal(SIGCHLD,SIG_IGN) # 系统方法处理僵尸进程,所有子进程退出由系统处理
p = Process(target=fun)
p.start()
p.join() # 防止僵尸产生
# 大量工作进入死循环
while True:
pass
* 尽量使用进程完成无阻塞的并发行为
* 不使用c作为解释器 (Java C#)
Guido的声明:<http://www.artima.com/forums/flat.jsp?forum=106&thread=214235>