代码笔记:
from threading import Thread, Lock # 导入线程模块
import time
'''
线程:轻量级的执行单元,允许程序并行执行多个任务。
1.通过threading模块,可以创建和管理线程,实现并发操作。
2.线程共享同一内存空间,适合I/O密集型任务,但在CPU密集型任务中,Python的全局解释器锁(GIL)可能影响性能。
3.线程之间共享资源(全局变量)。
'''
li = [] # 全局变量
def w_data():
for i in range(5):
li.append(i)
time.sleep(0.2) # 模拟延迟:暂停执行指定的时间(以秒为单位)
print(f'写入的数据:{li}')
def r_data():
print(f'读取的数据:{li}')
if __name__ == '__main__':
t1 = Thread(target=w_data) # 创建子线程
t2 = Thread(target=r_data)
t1.start() # 开启子线程
t1.join() # 阻塞子线程
time.sleep(1)
t2.start()
'''
资源竞争:线程的资源竞争指的是多个线程同时访问共享资源(如变量、数据结构等)时可能发生的冲突。
影响:这种情况可能导致数据不一致、程序崩溃或意外行为。
线程同步:
1.线程等待(阻塞):join()——等待第一个线程执行完毕后,再继续执行下一个线程。
2.互斥锁:lock——对共享数据进行上锁,确保只有一个线程访问该共享数据。
注意:上锁和解锁要成对出现,否则将出现死锁。
方法:
acquire():上锁 release():释放锁(解锁)
'''
a = 0
b = 1000000
lock = Lock()
def add_1():
lock.acquire() # 上锁
for i in range(b):
global a
a += 1
print(a)
lock.release() # 解锁
def add_2():
lock.acquire() # 上锁
for i in range(b):
global a
a += 1
print(a)
lock.release() # 解锁
# add_1()
# add_2()
if __name__ == "__main__":
t1 = Thread(target=add_1)
t2 = Thread(target=add_2)
t1.start()
# t1.join() # 等待第一个线程执行完毕后,再继续执行下一个线程。
t2.start()
'''
进程:操作系统资源调度的基本单位,是操作系统的基础。进程指程序执行的过程,属于动态概念。
注意:一个进程可以创建多个线程,多进程可以完成多任务。
进程的状态:
就绪态:拥有了除CPU以外的所有所需资源的状态。
运行态:正在使用CPU执行的状态。
阻塞态:等待某些条件满足的状态。
进程语法结构:multiprocessing模块提供Process类来代表进程对象
Process相关常用参数:
target:执行的目标名,即子进程要执行的任务。
args:以元组的形式传参。
kwargs:以字典的形式传参。
Process相关常用方法:
start():开启子进程。
is_alive():判断子进程是否存活(存活返回True,死亡返回False)。
join():主进程等待子进程执行完毕。
Process相关常用属性:
name:当前进程的名字(默认Process-N)。
Pid:当前进程的编号。
'''
from multiprocessing import Process
import os
def eat():
print(f'子进程1的id:{os.getpid()}') # 通过os模块中的getpid()方法获取子进程的id
print(f'子进程获取主进程id:{os.getppid()}') # 通过os模块中的getppid()方法获取父进程的id
print('吃零食')
def watch():
print(f'子进程2的id:{os.getppid()}')
print('追剧')
if __name__ == "__main__":
p1 = Process(target=eat)
p2 = Process(target=watch)
p1.start()
p1.join()
p2.start()
p2.join()
print(f'主进程的id:{os.getpid()}')
print(f"p1进程的id:{p1.pid}")
print(f"p2进程的id:{p2.pid}")
print(p1.is_alive())
print(p2.is_alive())
'''
进程之间不共享全局变量
'''
li1 = []
def w_data():
for i in range(5):
li1.append(i)
time.sleep(0.2) # 模拟延迟:暂停执行指定的时间(以秒为单位)
print(f'写入的数据:{li1}')
def r_data():
print(f'读取的数据:{li1}')
if __name__ == '__main__':
p1 = Process(target=w_data)
p2 = Process(target=r_data)
p1.start()
p1.join()
p2.start() # 进程不共享全局变量,导致写入到列表后,读取的列表为空。
运行结果:
写入的数据:[0, 1, 2, 3, 4]
读取的数据:[0, 1, 2, 3, 4]
1000000
2000000
子进程1的id:11128
子进程获取主进程id:17168
吃零食
子进程2的id:17168
追剧
主进程的id:17168
p1进程的id:11128
p2进程的id:4048
False
False
写入的数据:[0, 1, 2, 3, 4]
读取的数据:[]