并发编程-练习题
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()
共有 0 条评论