一、题目

编写一个C/S架构的分布式程序,Server接受Client发来的请求,执行一个计算F(X)并给Client返回结果;分别用进程与线程作为服务器Server实现,并比较服务器的开销。可以在一台机器上模拟。

二、实验过程

用python实现Client和Server,实现Client发送一个数,Server返回这个数的4次方。server_process用进程实现,server_thread用线程实现。client.py中计算从发送第一个数据到接收完最后一个数据的时间差

源代码如下:

client.py

import socket
import time


time1 = time.time()
for i in range(1,100):
    s = socket.socket()
    host = socket.gethostname()
    port = 1234
    s.connect((host,port))
    s.send('20')
    print(s.recv(1024).decode('utf-8'))

time2 = time.time()
print(time2 - time1)

server_thread.py

import socket
from threading import Thread


s = socket.socket()
host = socket.gethostname()
s.bind((host,1234))
s.listen(100)
print("Waiting for connection......")

def tcplink(sock,addr):
    print("Accept new connection from %s:%s" % addr)
    data = sock.recv(1024)
    i = int(data)
    sock.send(str(i*i*i*i))
    sock.close()
    print("connection closed!")

while True:
    sock, addr = s.accept()
    t = Thread(target = tcplink, args = (sock,addr))
    t.start()

server_process.py

import socket
from multiprocessing import *


s = socket.socket()
host = socket.gethostname()
s.bind((host,1234))
s.listen(100)
print("Waiting for connection......")

def tcplink(sock,addr):
    print("Accept new connection from %s:%s" % addr)
    data = sock.recv(1024)
    i = int(data)
    sock.send(str(i*i*i*i))
    sock.close()
    print("connection closed!")

while True:
    sock, addr = s.accept()
    t = Process(target = tcplink, args = (sock,addr))
    t.start()

三、实验结果

多进程实现如图所示:

1570463537221

多线程实现如图所示:

1570463576753

从结果图中可以看到,多进程所用时间为0,14178,而多线程所用时间为0.04780,多进程比多线程慢了将近2倍,因此可以得出结论,多进程在服务器中开销较大,使用多线程速度较快。


"Imagination will take you everywhere."