进程是分配资源的基本单位, 一旦创建一个进程就会分配一定的资源;
线程是cpu调度的基本单位,每个进程至少都有一个线程,而这个线程就是我们通常说的主线程。
1. 导入进程工具包 import multiprocessing
# 导包
import multiprocessing
2. 通过进程类 实例化进程对象 子进程对象 = multiprocessing.Process(target=任务名)
p1 = multiprocessing.Process(target=coding)
3. 启动进程执行任务 子进程对象.start()
p1.start()
进程实例:
# 1. 定义函数, 表示: 敲代码.
def coding():
for i in range(2):
print(f'敲代码.... {i}')
# 2. 定义函数, 表示: 听音乐.
def music():
for i in range(2):
print(f'听音乐.... {i}')
# 3. 定义main函数, 因为子进程是根据主进程(main进程)创建出来的.
if __name__ == '__main__':
# 4. 创建进程1, 关联: coding函数
p1 = multiprocessing.Process(target=coding)
# 5. 创建进程2, 关联: music函数
p2 = multiprocessing.Process(target=music)
# 6. 开启上述的两个进程, 看看多任务(多进程)执行效果.
p1.start()
p2.start()
# 打印结果:
敲代码.... 0
敲代码.... 1
听音乐.... 0
听音乐.... 1
1. 导入线程模块:import threading
import threading
2. 通过线程类创建线程对象 :线程对象 = threading.Thread(target=任务名)
t1 = threading.Thread(target=music)
3. 启动线程执行任务:线程对象.start()
t1.start()
举例说明:
# 1. 导包
import threading
# 2. 定义函数, 听音乐
def music():
for i in range(2):
print(f'正在听第 {i} 首音乐')
# 3. 定义函数, 敲代码
def coding():
for i in range(2):
print(f'正在敲第 {i} 行代码')
# 主进程/主线程.
if __name__ == '__main__':
# 4. 创建子线程.
t1 = threading.Thread(target=music)
t2 = threading.Thread(target=coding)
# 5. 开启线程.
t1.start()
t2.start()
# 打印结果:
正在听第 0 首音乐
正在听第 1 首音乐
正在敲第 0 行代码
正在敲第 1 行代码
关于进程和线程都有抢占资源的情况,因为子进程和子线程是同时开始的
小张正在听第 0 首音乐...
小张 正在敲第 0 行代码
小张 正在敲第 1 行代码小张正在听第 1 首音乐...
小张 正在敲第 2 行代码
小张正在听第 2 首音乐...
小张正在听第 3 首音乐...
小张 正在敲第 3 行代码
无论是进程还是线程都可以传递参数
子进程对象 = multiprocessing.Process(target=任务名,args/kwargs=要传递的参数)
p1 = multiprocessing.Process(target=coding,args=('小明',5))
p2 = multiprocessing.Process(target=coding,kwargs={'name' : '小明', 'count' : 5})
线程对象 = threading.Thread(target=任务名,args/kwargs=要传递的参数)
t1 = threading.Thread(target=write, args=('小明',5))
t2 = threading.Thread(target=music, kwargs={'name' : '小明', 'count' : 5})
多进程与多线程的区别:
1. 线程是依附在进程里面的,没有进程就没有线程,一个进程默认提供一条线程,进程可以创建多个线程。
2.进程之间不共享全局变量,线程之间共享全局变量
3.进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位