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'))
  • 将具体内容整理到博客中

选做题

  • 计算机硬件知识扩展(感兴趣)
  • 数据分析算法学习资料收集(感兴趣)
posted @ 2020-04-22 21:22  Lance_王  阅读(163)  评论(0编辑  收藏  举报