首页 » 编程 » Python-7.并发编程 » 正文

并发编程-练习题

1、简述计算机操作系统中的“中断”的作用?

        让CPU可以雨露均沾,避免某个进程长期占用CPU,导致其他进程无法进行计算操作。

2、简述计算机内存中的“内核态”和“用户态”;

        内核态:由操作系统发出指令给硬件进行计算

        用户态:用户态不能直接操作硬件,所以当有计算任务时,实际上是由用户发出指令给操作系统,再由操作系统发出指令给硬件进行计算。

3、进程间通信方式有哪些?

        在python中进程间是完全隔离的,所以要想实现进程间通信可依靠管道和消息队列来实现。

4、简述你对管道、队列的理解;

mutiprocessing模块为我们提供的基于消息的IPC通信机制:队列和管道。

队列和管道都是将数据存放于内存中,而队列又是基于(管道+锁)实现的,可以让我们从复杂的锁问题中解脱出来,因而队列才是进程间通信的最佳选择。

我们应该尽量避免使用共享数据,尽可能使用消息传递和队列,避免处理复杂的同步和锁问题,而且在进程数目增多时,往往可以获得更好的可获展性。

5、请列举你知道的进程间通信方式;

队列和管道。

6、什么是同步I/O,什么是异步I/O?

同步IO包含有:阻塞IO,非阻塞IO,IO多路复用

异步IO宝行有:异步IO

7、请问multiprocessing模块中的Value、Array类的作用是什么?举例说明它们的使用场景

8、请问multiprocessing模块中的Manager类的作用是什么?与Value和Array类相比,Manager的优缺点是什么?

9、写一个程序,包含十个线程,子线程必须等待主线程sleep 10秒钟之后才执行,并打印当前时间;

# 9、写一个程序,包含十个线程,子线程必须等待主线程sleep 10秒钟之后才执行,并打印当前时间;

from threading import Timer, current_thread
import time


def say():
    print("%s is say, time is: %s." % (current_thread(), time.asctime()))


if __name__ == '__main__':
    print("主线程, time is: %s" % (time.asctime()))
    for i in range(10):
        t = Timer(10, say)
        t.start()

 

10、写一个程序,包含十个线程,同时只能有五个子线程并行执行;

# 10、写一个程序,包含十个线程,同时只能有五个子线程并行执行;

from threading import Thread, Semaphore, current_thread
import time
import random


def say():
    sm.acquire()
    print("%s is saying." % current_thread().getName())
    time.sleep(random.randint(1, 3))
    sm.release()


if __name__ == '__main__':
    sm = Semaphore(5)
    for i in range(10):
        t = Thread(target=say)
        t.start()

 

11、写一个程序,要求用户输入用户名和密码,要求密码长度不少于6个字符,且必须以字母开头,如果密码合法,则将该密码使用md5算法加密后的十六进制概要值存入名为password.txt的文件,超过三次不合法则退出程序;

# 11、写一个程序,要求用户输入用户名和密码,要求密码长度不少于6个字符,且必须以字母开头,如果密码合法,则将该密码使用md5算法加密后的十六进制概要值存入名为password.txt的文件,超过三次不合法则退出程序;
import re
import hashlib

count = 0
while True:
    if count == 3:
        print("错误超过3次,退出。")
        break
    username = input("请输入用户名:").strip()
    password = input("请输入密码:").strip()

    if len(password) < 6:
        print("密码长度不够")
    elif re.match("[A-z]", password, 1) is None:
        print("密码不合法")
    else:
        hash = hashlib.md5()
        hash.update(password.encode("utf-8"))
        md5_password = hash.hexdigest()
        f = open("password.txt", "w", encoding="utf-8")
        f.write(md5_password)
        f.close()
        print("已写入md5密码到文件")
        break
    count += 1

 

12、写一个程序,使用socketserver模块,实现一个支持同时处理多个客户端请求的服务器,要求每次启动一个新线程处理客户端请求;

server.py

import socketserver


class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        while True:
            recv_data = self.request.recv(1024).decode("utf-8")
            if not recv_data: break
            print("recv message: ", recv_data)
            self.request.send(recv_data.upper().encode("utf-8"))
        self.request.close()


server = socketserver.ThreadingTCPServer(("127.0.0.1", 9090), MyServer)
server.serve_forever()

client.py

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("127.0.0.1", 9090))

while True:
    inp = input(">>: ").strip()
    client.send(inp.encode("utf-8"))
    recv_data = client.recv(1024).decode("utf-8")
    print("recv message: ", recv_data)
client.close()

 

 

 

发表评论

− 2 = 1