并发
内容回顾1
day31 操作系统
day32 并发进程阻塞第一天
# 74个人 8组 9/9/9/9/9/9/10/10
# 基于原生socket的udp协议实现将client端发送过来的消息放到字典中
# 字典的key是所有客户端的地址,value是一个列表
# io :输入输出,
# 输入到内存,向内存输入
# 从内存中向外(硬盘,网络)输出
# 操作系统的发展史
# 多道操作系统
# 分时操作系统
# 并发和并行
# 并发 : 多个程序在一个cpu上交替运行
# 并行 : 在多个cpu上同时有多个程序在执行
# 阻塞和非阻塞
# 指CPU是否在工作
# 在工作 :非阻塞
# 不在工作 :阻塞
# 同步和异步
# 调一个任务,需要等待这个任务执行完并返回结果,现在的代码才能继续
# 调一个任务,不关心这个任务是否执行是否完毕,只负责调用,余下的内容和我当前的代码是各自执行的
# 进程和程序
# 运行中的程序
# 是计算机中最小的资源分配单位
# 多个进程之间的数据互相隔离
# pid能够在操作系统中唯一标识一个进程
# 进程的三状态图 : 就绪 运行 阻塞
# 进程的创建和结束
# 进程的调度
# 先来先服务
# 短作业优先
# 分时/多道
# 多级反馈队列
# 登录
# input()
# input()
# 判断用户名密码
# import sys
# print(sys.argv)
# if sys.argv[1] == 'alex' and sys.argv[2] == 'alex3714':
# print('登录成功')
总结
# 1.开启子进程
# tartget
# args
# if __name__ == '__main__'
# start()
# 2.其他的方法
# 方法 :
# terminate()
# is_alive()
# 属性
# pid
# name
# 3.开启多个子进程
# 4.join
# 阻塞等待一个子进程结束
# 阻塞等待多个子进程结束
# 5.守护进程
# 6.面向对象的方式实现多进程
import os
from multiprocessing import Process
class MyProcess(Process):
def run(self): # 希望在子进程中执行的代码就放在run方法中
print(os.getpid())
if __name__ == '__main__':
for i in range(10):
MyProcess().start()
# import os
# from multiprocessing import Process
# class MyProcess(Process):
# def __init__(self, a, b):
# super().__init__()
# self.a = a
# self.b = b
#
# def func(self):
# print(1)
#
# def run(self): # 希望在子进程中执行的代码就放在run方法中
# print(os.getpid(), self.a, self.b)
# self.func()
#
# if __name__ == '__main__':
# for i in range(10):
# MyProcess(1,2).start() # 通知操作系统开进程,执行run方法
# import sys
# print(sys.modules[__name__])
# print(__name__)
# print(sys.modules)
# 明天要默写
# 0.内容回顾的概念
# 1.使用multiprocess起一个最简单的子进程,执行查看子进程的进程id
# 2.使用多进程实现socket tcp协议的并发server端
# 博客上有答案
# __main__': <module '__main__' from 'D:/program/feiq/Recv Files/python脱产班20期/day32 并发进程阻塞第一天/day32/5.Process类的总结.py'>
day33 生产者消费者
# 几个问题
# 1.概念多,练习少
# 2.不问问题
# 概念?代码?
# Process类
# 1.并发并行
# 并发 是同一时间段内多个任务交替使用同一个cpu
# 并行 是在同一个时刻多个任务在不同的cpu上同时执行
# 2.同步异步
# 同步 发布一个任务,要等待这个任务结束之后才能继续
# 异步 发布一个任务,不等待这个任务的结束就可以继续执行当前的内容
# 3.阻塞非阻塞
# 阻塞 : 在当前任务中cpu不工作
# 非阻塞 : cpu还在继续为当前程序在执行
# 4.start terminate join
# start\terminate 异步非阻塞
# join 同步阻塞
# 5.io操作
# i :输入到内存
# o :从内存向外(网络 硬盘)输出
# join
# import time
# import random
# from multiprocessing import Process
# def done(name):
# num = random.uniform(1, 3)
# print('start buy %s'%name,num)
# time.sleep(num)
# print('end buy %s' % name)
#
#
# if __name__ == '__main__':
# l = []
# p1 = Process(target=done,args=('橘子',))
# p1.start()
# l = [p1]
# p2 = Process(target=done, args=('苹果',))
# p2.start()
# l = [p1,p2]
# p3 = Process(target=done, args=('榴莲',))
# p3.start()
# l = [p1, p2,p3]
# p1.join() # 等买橘子的那个人回来 只关心p1这个子进程是否执行完
# print('买橘子的那个人回来了')
# p2.join() # 等买苹果的人回来
# print('买苹果的那个人回来了')
# p3.join() # 等待榴莲的人回来
# print('买榴莲的那个人回来了')
# import time
# import random
# from multiprocessing import Process
# def done(name):
# num = random.uniform(1, 3)
# print('start buy %s'%name,num)
# time.sleep(num)
# print('end buy %s' % name)
#
#
# if __name__ == '__main__':
# l = ['橘子','苹果','榴莲']
# p_l = []
# for fruit in l:
# p = Process(target=done,args=(fruit,))
# p.start()
# p_l.append(p)
# print(p_l)
# for p in p_l:
# p.join() # 阻塞 等橘子回来;阻塞 等苹果回来;阻塞 等榴莲回来
# join Process模块提供给我们的 对子进程同步管理的方法
# import time
# import random
# from multiprocessing import Process
# def done(name):
# num = random.uniform(1, 3)
# print('start buy %s'%name,num)
# time.sleep(num)
# print('end buy %s' % name)
#
#
# if __name__ == '__main__':
# l = ['橘子','苹果','榴莲']
# for fruit in l:
# p = Process(target=done,args=(fruit,))
# p.start()
# p.join()
# 开启进程 Process类
# 实例化的时候引用的参数 : target = 函数名,args=(参数1,)
# 方法 : start 开启进程 terminate 结束进程 join等待子进程结束
# 属性 :
# name 进程名 pid进程id
# daemon 一定要在start之前设置,设置一个子进程为守护进程,守护进程在主进程的代码结束之后结束
# 使用类的方式开启子进程
# from multiprocessing import Process
# class 类名(Process):
# def __init__(self,参数1,参数2):
# super().__init__()
# self.参数1 = 参数1
# self.参数2 = 参数2
# def run(self):
# '''要写在子进程中的代码
# 可以使用self中的所有参数'''
# pass
# if __name__ == '__main__':
# p = 类名('参数1','参数2')
# p.start()
# from multiprocessing import Process
# def func():pass
#
# if __name__ == '__main__':
# Process(target=func).start()
# a = 1
# print(a)
day34 线程bing'fa
# 2个人 5个题 面试题
# 7点 考试题
# 五一之前 要考试
# 其他内容(40%) 网编并发数据库(60%)
# 锁
# 互斥锁
# 能够保护数据的安全性
# 保证对于数据的修改操作同一时刻多个进程只有一个进程执行
# 进程数据不安全 : 同时修改文件/数据库/其他共享资源的数据
# 队列 -- 实现了进程之间的通信(IPC)
# 进程队列 -- 进程安全
# 从multiprocessing导入Queue
# q = Queue()
# put/get/put_nowait(丢数据)/get_nowait
# 基于 管道 + 锁,管道进程不安全
# 管道 基于文件级别的socket实现的
import queue
from multiprocessing import Queue
# q = Queue(5)
# q.put(1)
# q.put(1)
# q.put(1)
# q.put(1)
# q.put(1)
# print('________')
# try:
# q.put_nowait(1)
# except queue.Full:
# pass
# print('********')
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())
# try:
# print(q.get_nowait())
# except queue.Empty:
# pass
# 生产者消费者模型
# 一个生产数据和消费数据的完整的流程解耦成为两个部分 : 生产 和 消费
# 由于生产速度和消费速度不一致,所以需要我们调整生产者和消费者的个数来达到效率平衡
day35 线程守护线程——锁
# 互斥锁
# 在同一个进程中连续锁两次以上会死锁
# 进程的数据共享
# 进程之间可以共享数据
# 提供共享数据的类是Manager
# 但是他提供的list\dict这些数据类型是数据不安全的
# 针对 += -= *= /=
# 需要加锁来保证安全
# 用到了进程之间的通信
# 队列 queue
# 管道
# manager
# lock
# Process
# 线程
# 概念
# 进程和线程的区别
# 进程 开销大 数据隔离
# 是计算机中最小的资源分配单位
# 线程 轻量级 共享数据
# 是计算机中能被CPU调度的最小单位
# 正常的线程是什么样子
# 能同时被多个CPU执行
# Cpython解释器下的线程
# GIL锁
# 全局解释器锁
# 是Cpython解释器中的
# 会导致同一时刻只能有一个线程访问CPU
# 代码threading模块
# Thread类
# 开启线程
# 传参数
# join
# 没有terminate
# active_count int 当前程序中正在执行的线程个数
# current_thread 线程对象 能够获取当前线程的对象
# from multiprocessing import Process
# class MyProcess(Process):
# def __init__(self,args):
# super().__init__()
# self.args = args
#
# def run(self):
# print('子进程要执行',self.name)
#
# if __name__ == '__main__':
# p = MyProcess(1)
# p.start()
# p.name
#
# p2 = MyProcess(2)
# p2.start()
# p2.name
总结
# 守护线程
# 锁
# 互斥
# 递归
# 死锁现象
# 队列 线程安全的数据类型
# 先进先出
# 后进先出
# 优先级队列
# 池
# 控制进程的数量
# 节省资源开销
day36 协程 线程池
# 1.11:30
# 2.码云 :王老师检查作业+定期抽查
# 注册账号
# 3.考试的时间
# threading.enumerate(),能够获取到当前正在运行的所有线程对象列表
# 守护线程
# 守护线程会等待所有的非守护线程结束之后结束
# 守护线程的结束是因为主进程的结束
# 在start之前设置daemon = True
# 锁
# GIL锁 : 全局解释器锁,在Cpython解释器中,同一时刻同一个进程内只能有一个线程访问CPU
# 互斥锁
# 锁的是代码,一段代码被多个线程执行,并且要对全局的变量进行非原子性操作
# 互斥锁 : 在同一个线程中,不能连续acquire多次,并且可以做到多个线程中被锁的代码同时只有一个线程执行
# 递归锁 : 在同一个线程中,能连续acquire多次,并且可以做到多个线程中被锁的代码同时只有一个线程执行
# 从一定程度上可以避免死锁现象
# 使用递归锁也会产生死锁现象
# 死锁现象 : 只要实例化多把锁,并交替使用,都有可能产生死锁现象
# 只要是1把锁,递归锁永远不死锁
# 只要是2以及以上,交替使用,
# 只要是2以及以上,交替使用,递归锁互斥锁都可能死锁
# 队列
# from queue import Queue,LifoQueue,PriorityQueue
# queue这个模块提供的所有队列都是线程安全的
# 先进先出 Queue
# 后进先出 LifoQueue
# 优先级队列 PriorityQueue
# 进程池
# call_back回调函数
# concurrent.futures
# ProcessPoolExecutor
# from concurrent.futures import ProcessPoolExecutor
# pool = ProcessPoolExecutor(5)
# pool进程池对象
# ret = pool.map(func,iter)
# ret是一个可迭代对象,迭代器(惰性运算),可以直接通过for循环从ret中获取返回值
# submit
#1. for + submit(func,arg1,arg2) = map
# 任务对象task
#2. task = submit(func)
#3. task.result() 获取任务函数的返回值 (阻塞方法)
#4. task.add_done_callback(回调函数)
# shutdown
# pool.shutdown() 等待进程池中所有的任务都执行完毕之后结束阻塞
# import time
# from concurrent.futures import ProcessPoolExecutor
#
# def func():
# time.sleep(1)
# return '*'*20
#
# if __name__ == '__main__':
# p = ProcessPoolExecutor(4)
# task = p.submit(func)
# time.sleep(2)
# print('---->')
#
# print(task.result()) # 阻塞方法
# 池
# time/random 在任务中睡一会儿,在主线程可以睡一会儿
# threading.current_thread().ident
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
· 如何打造一个高并发系统?