【Python】Python学习笔记17

代码笔记: 

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]
读取的数据:[]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值