关于并发编程的作业

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

    答:当程序执行中遇见中断时,保留此时的状态,转而执行其他的操作,完成后继续从上次切的状态执行。

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

    答:

            内核态主要是操作系统,其受硬件保护,不能被用户修改;大型、复杂、长寿。

            用户态主要是一些应用软件以及接口程序,可以被用户修改,比较小型。

            操作系统可以隐藏复杂、丑陋的接口,同时使应用程序的竞争更加有序化。

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

    答:不同的进程的内存是相互隔离的。

        

            进程之间的通信可以通过通道与队列实现,Queue模块,(put、get、full、empty)

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

    答:管道(PIPE):管道通信方式的中间介质是文件,一端进行写操作,一端进行读操作,通过管道进行协调,l流式的传输信息。

            队列:消息队列提供了一种在两个不相关进程间传递数据的简单有效的方法,发送的是一个一个的数据块。

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

    答:同步I/O:遇见I/O阻塞时,主线程会在此等候,直到阻塞结束。

            异步I/O:遇见i/O阻塞,返回一个异常,主线程继续执行;当I/O准备好时,发送一个信号提醒。

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

    答:实现进程之间数据内存的共享。

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

    答:Manager也是用于共享内存。其优点在于可以用于进程池/线程池中,缺点体现在Windows中,会占用较多的资源(要置于if __name__ == "__main__"之下)。

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

    答:

from threading import Timer
import time


def eat(i):
    print("%d: %f" % (i, time.time()))


p_li = []
if __name__ == "__main__":
    for i in range(10):
        p = Timer(10, eat, args=(i,))
        p_li.append(p)

    for p in p_li:
        p.start()

    print("主: %s" % time.time())

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

    答:

from concurrent.futures import ThreadPoolExecutor
import time


def drink(i):
    time.sleep(0.5)
    print(i)


pool = ThreadPoolExecutor(5)  # 线程池
if __name__ == "__main__":
    # for i in range(10):
    #     pool.submit(drink, i)
    pool.map(drink, range(0, 9))
    pool.shutdown()
    print("主")

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

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

import socket
import random
import time
from threading import Thread


IP_ADDR = ("127.0.0.1", 8081)


def communation(conn):
    while True:
        res = conn.recv(1024).decode("utf-8")
        print("client(%s):%s" % (conn, res))
        if not res:
            break

        if res == "quit":
            break

        time.sleep(random.randint(1, 3))
        conn.send(res.upper().encode("utf-8"))
        print(time.time())

    conn.close()
    print("%s链接断开" % conn)


def sever():
    sever = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sever.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    sever.bind(IP_ADDR)
    sever.listen(3)
    while True:
        conn, addr = sever.accept()
        t = Thread(target=communation, args=(conn,))  # 创建一个新子线程
        t.start()


sever()
import socket


IP_ADDR = ("127.0.0.1", 8081)


def communation(conn):
    while True:
        input_ = input("Input:").strip().encode("utf-8")
        if not input_:
            continue
        conn.send(input_)

        res = conn.recv(1024).decode("utf-8")
        print("sever:%s" % res)

    conn.close()
    print("%s链接断开" % conn)


def client():
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    client.connect(IP_ADDR)
    communation(client)

client()

版权声明:本文为dtf1026536690原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。