python并发基础小练习
必做题
- 简述操作系统发展史
- 手工操作(无操作系统)
缺点:1、用户独占全机
2、CPU等待人工操作
- 批处理系统(脱机输入输出系统)(操作系统开始出现)
省了大量手工操作
1、单道批处理系统:没有并发性
特点:自动性、顺序性、单道性
缺点:I/O操作时,CPU无事可做
2、多道批处理系统:具有并发性
特点:多道性、宏观上多任务并行、微观上多任务分片串行
优点:由于提高了CPU、内存和I/O设备的利用率,因此系统吞吐得到提高
需要解决的问题:
处理及管理问题、内存管理问题、I/O设备管理问题、文件管理问题和作业管理问题
缺点:无交互能力
- 分时系统
特点:多路性、独立性(宏观)、及时性和交互性
- 实时系统(约束更严格的分时系统)
特点:多路性、独立性、及时性和可靠性
- 微机操作系统
单用户单任务系统(dos)、单用户多任务系统(windows)、多用户多任务系统(Linux、Uinux)
- 简述进程发展史及算法演变
先来先服务
时间段的先服务
时间片轮转发+多级反馈队列
等等……
- 简述多道技术
一个任务在占用cpu时,输入输出设备不会空闲,为下一个任务的运行做准备
- 简述同步异步阻塞非阻塞概念
同步:可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到返回的值或消息后才往下执行其他的命令。
异步:执行完函数或方法后,不必阻塞性地等待返回值或消息,只需要向系统委托一个异步过程,那么当系统接收到返回值或消息时,系统会自动触发委托的异步过程,从而完成一个完整的流程。
阻塞:阻塞态
非阻塞:就绪态、运行态
- 书写进程创建的两种方式
# 第一种方式 导入模块的方式
from multiprocessing import Process
import time
def task(name):
print('%s is running'%name)
time.sleep(3)
print('%s is over'%name)
if __name__ == '__main__':
p = Process(target=task, args=('pipi',))
p.start()
print('>>>>>')
# 第二种方式 类的继承
from multiprocessing import Process
import time
class MyProcess(Process):
def run(self):
print('hello bf girl')
time.sleep(1)
print('get out!')
if __name__ == '__main__':
p = MyProcess()
p.start()
print('>>>>>')
- 手动书写生产者消费者代码
from multiprocessing import Process
from multiprocessing import JoinableQueue
import time
import random
def producer(name, food, q):
for i in range(4):
data = f'{food}{i}'
time.sleep(random.uniform(1, 2))
print(f'生产者{name}生产了{data}')
q.put(data)
def customer(name, q):
while True:
data = q.get()
time.sleep(random.choice([1, 2]))
print(f'消费者{name}购买了{data}')
q.task_done() # 没执行一次队列数据计数器-1
if __name__ == '__main__':
q = JoinableQueue()
p1 = Process(target=producer, args=('商家1', '包子', q))
p2 = Process(target=producer, args=('商家2', '泔水', q))
c1 = Process(target=customer, args=('用户1', q))
c2 = Process(target=customer, args=('用户2', q))
c1.daemon = True
c2.daemon = True
p1.start()
p2.start()
c1.start()
c2.start()
p1.join()
p2.join()
q.join()
- 利用多进程或多线程自己实现TCP服务端的并发
import socket
from threading import Thread
from multiprocessing import Process
server =socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
def talk(conn):
# 通信循环
while True:
try:
data = conn.recv(1024)
if len(data) == 0: break
print(data.decode('utf-8'))
conn.send(data.upper())
except ConnectionResetError as e:
print(e)
break
conn.close()
# 链接循环
while True:
conn, addr = server.accept() # 接客
t = Thread(target=talk,args=(conn,))
# t = Process(target=talk,args=(conn,))
t.start()
"""客户端"""
import socket
client = socket.socket()
client.connect(('127.0.0.1',8080))
while True:
client.send(b'hello world')
data = client.recv(1024)
print(data.decode('utf-8'))
- 将具体内容整理到博客中
选做题
- 计算机硬件知识扩展(感兴趣)
- 数据分析算法学习资料收集(感兴趣)