一、进程:
进程是并行执行:多个进程可以同时做不同的事。
进程是操作系统进行资源分配的基本单位。
一个程序运行后至少有一个进程,一个进程默认有一个线程,进程里面可以创建多个线程,线程是依附在进程里面的,没有进程就没有线程。
1、创建进程:
""" 导入进程模块 """
import multiprossing
""" 创建进程实例对象 """
# target: 进程执行的方法名
# args: 传入元组形式的参数
# kwargs: 传入字典形式的参数,字典的key要和方法中的参数名保持一致
# daemon: 创建进程是设置守护进程
test_process = multiprocessing.Process(target: function, [args=(,)/kwargs={'key': value}], daemon=True)
# 进程创建后设置守护进程(需要在进程启动之前)
test_process.daemon = True
# 启动进程
test_process.start()
# 主进程等待当前进程 test_process 执行结束后才会执行后面的代码
test_process.join()
# 终止进程(可以在进程运行时终止)
test_process.terminate()
2、多个进程不共享全局变量:每一个进程都是相互独立的
二、线程:
线程是并发执行:多个线程同时做同一件事。
线程是cpu调度的基本单位。
1、创建线程:
""" 导入线程模块 """
import threading
""" 创建线程实例对象 """
# target: 线程执行的方法名
# args: 传入元组形式的参数
# kwargs: 传入字典形式的参数,字典的key要和方法中的参数名保持一致
# daemon: 创建线程是设置守护线程
test_thread = threading.Thread(target: function, [args=(,)/kwargs={'key': value}], daemon=True)
# 线程创建后设置守护线程(需要在线程启动之前)
test_thread.daemon = True
# 或
test_thread.setDaemon(True)
# 启动线程
test_thread.start()
# 主线程等待当前线程 test_thread 执行结束后才会执行后面的代码
test_thread.join()
2、多个线程共享全局变量,线程的运行是无序的
3、互斥锁
如果多个线程在同一时间同时调用全局变量,会使全局变量的数据发生紊乱,这时可以创建互斥锁。
目的:保证一次只有一个线程访问全局变量,防止全局变量发生数据紊乱。
代码:
import threading
# 创建互斥锁
mutex = threading.Lock()
# 抢锁(一次只允许一个线程进入)
mutex.acquire()
# 释放(释放后可以让下一个线程进入)
mutex.release()
三、进程和线程的关系
1、关系
(1) 线程是依附在进程里的,没有进程就没有线程。
(2) 一个进程默认提供一条线程,进程可以创建多个线程。
2、区别
(1) 进程之间不共享全局变量。
(2) 线程之间共享全局变量,但是会有资源竞争,解决办法:线程同步或互斥锁。
(3) 创建进程的开销比创建线程开销大。
(4) 进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位。
(5) 线程不能独立运行,必须依存在进程中。
(6) 多进程开发比单进程多线程开发稳定性更强。