多进程多线程的区别_多进程和多线程效率

多进程多线程的区别_多进程和多线程效率前一篇文章介绍了单任务的HTTP服务器,那么如何实现多任务的呢,本篇文章将实现HTTP服务的并发处理,分别从多进程,多线程,协程的方法来实现,代码有点多,引入了3个文件,重复度有点高,读者只看关键部分,就好了,主要是服务端的数据收发阶段。测试方法:将html文件方法和代码同路径下,运行代码,在浏览器中输入IP:端口/XX.html即可看到成功解析html文件(这里不讨论html中的内容,只需明白实现思路即可)如图:****1. 多进程实现HTTP服务器的并发import socketimport

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前一篇文章介绍了单任务的HTTP服务器,那么如何实现多任务的呢,本篇文章将实现HTTP服务的并发处理,分别从多进程,多线程,协程的方法来实现,代码有点多,引入了3个文件,重复度有点高,读者只看关键部分,就好了,主要是服务端的数据收发阶段。

测试方法:将html文件方法和代码同路径下,运行代码,在浏览器中输入IP:端口/XX.html即可看到成功解析html文件(这里不讨论html中的内容,只需明白实现思路即可)
如图:

在这里插入图片描述
在这里插入图片描述

****1. 多进程实现HTTP服务器的并发

import socket
import re
import multiprocessing

""" TCP 的服务端 1,socket 创建socket 2.bind 绑定IP和端口 3.listen 处于监听状态 4.accept 接进来客户端的连接 5.recv/send 接受或者发送信息 6.close 关闭 """


def tcp_creat_socket():
    tcp_ser = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
    return tcp_ser


def tcp_bind_listern_info(tcp_socket):
    SER_IP = "127.0.0.1"
    # SER_PORT = int(input("服务器绑定的端口:"))
    SER_PORT = 7080
    SER_INFO = (SER_IP, SER_PORT)
    tcp_socket.bind(SER_INFO)

    LISTEN_NUM = 10
    tcp_socket.listen(LISTEN_NUM)
    return SER_INFO


def tcp_accept(tcp_socket,ser_info):
    # accept 1默认会阻塞,2并返回一个新的套接字用于和接进来的客户端进行数据传输,3并记录客户端的信息,为用户进行服务
    print("服务器的IP:%s,端口:%d,正在等待新的客户端的到来" % (ser_info[0], ser_info[1]))
    tcp_ser_new_socket, client_addr = tcp_socket.accept()
    print("客户端已经到来,信息如下:%s" % str(client_addr))
    return tcp_ser_new_socket


def tcp_recv_message(tcp_socket):
    # recv 返回值为空时,则客户端调用了close
    tcp_ser_recv_info = tcp_socket.recv(1024)
    if "exit" == tcp_ser_recv_info or None == tcp_ser_recv_info:
        print("recv_info error")

    # GET / HTTP/1.1
    # Host: www.baidu.com
    # Connection: keep-alive
    # sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"
    # sec-ch-ua-mobile: ?0

    print(">"*120)
    print("服务端接收:%s" % tcp_ser_recv_info.decode("utf-8").splitlines()[0])
    ret = re.match(r"[^/]+(/[^ ]*)", tcp_ser_recv_info.decode("utf-8").splitlines()[0])
    if ret:
        http_page_name = ret.group(1)
        return http_page_name


def tcp_send_message(tcp_socket, page_name):
    # send_info = str(input("输入服务端发送的信息:"))
    if "/" == page_name:
        page_name = "index"  # 默认的页面
    try:
        f = open(f"./{ 
     page_name}.html", "rb")   # 二进制文件
        html_file = f.read()
        f.close()
    except:
        header = "HTTP/1.1 404 NOT FOUND\r\n"  # 相应头部
        respone = "\r\n"  # 空行
        http_headr = header + respone + f"{ 
     page_name} not fount ,please again"
        tcp_socket.send(http_headr.encode("utf-8"))
    else:
        header = "HTTP/1.1 200 OK\r\n"  # 相应头部
        respone = "\r\n"  # 空行
        http_headr = header + respone

        http_body = html_file
        tcp_socket.send(http_headr.encode("utf-8"))
        tcp_socket.send(http_body)

    tcp_socket.close()


def tcp_close(tcp_socket):
    tcp_socket.close()


def service_client(new_socket):
    # recv
    page_name = tcp_recv_message(tcp_socket=new_socket)

    # send
    tcp_send_message(tcp_socket=new_socket, page_name=page_name)


def CC_server():
    # 创建
    tcp_ser =tcp_creat_socket()

    # bind and listen
    ser_info = tcp_bind_listern_info(tcp_socket=tcp_ser)

    while True:  # 循环为多个客户端服务,一直处于监听状态
        new_socket = tcp_accept(tcp_socket=tcp_ser, ser_info=ser_info)

        p_client = multiprocessing.Process(target=service_client,args=(new_socket,))  # 启动一个线程去执行客户端的服务
        p_client.start()
        new_socket.close()

        # close 关闭发送数据的客户端的连接
        tcp_close(tcp_socket=new_socket)

    # close
    tcp_close(tcp_socket=tcp_ser)


if __name__ == "__main__":
    CC_server()

  1. 多线程实现HTTP服务器的并发
import socket
import re
import threading

""" TCP 的服务端 1,socket 创建socket 2.bind 绑定IP和端口 3.listen 处于监听状态 4.accept 接进来客户端的连接 5.recv/send 接受或者发送信息 6.close 关闭 """

def tcp_creat_socket():
    tcp_ser = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
    return tcp_ser

def tcp_bind_listern_info(tcp_socket):
    SER_IP = "127.0.0.1"
    # SER_PORT = int(input("服务器绑定的端口:"))
    SER_PORT = 7080
    SER_INFO = (SER_IP, SER_PORT)
    tcp_socket.bind(SER_INFO)

    LISTEN_NUM = 10
    tcp_socket.listen(LISTEN_NUM)
    return SER_INFO

def tcp_accept(tcp_socket,ser_info):
    # accept 1默认会阻塞,2并返回一个新的套接字用于和接进来的客户端进行数据传输,3并记录客户端的信息,为用户进行服务
    print("服务器的IP:%s,端口:%d,正在等待新的客户端的到来" % (ser_info[0], ser_info[1]))
    tcp_ser_new_socket, client_addr = tcp_socket.accept()
    print("客户端已经到来,信息如下:%s" % str(client_addr))
    return tcp_ser_new_socket

def tcp_recv_message(tcp_socket):
    # recv 返回值为空时,则客户端调用了close
    tcp_ser_recv_info = tcp_socket.recv(1024)
    if "exit" == tcp_ser_recv_info or None == tcp_ser_recv_info:
        print("recv_info error")

    # GET / HTTP/1.1
    # Host: www.baidu.com
    # Connection: keep-alive
    # sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"
    # sec-ch-ua-mobile: ?0

    print(">"*120)
    print("服务端接收:%s" % tcp_ser_recv_info.decode("utf-8").splitlines()[0])
    ret = re.match(r"[^/]+(/[^ ]*)", tcp_ser_recv_info.decode("utf-8").splitlines()[0])
    if ret:
        http_page_name = ret.group(1)
        return http_page_name

def tcp_send_message(tcp_socket, page_name):
    # send_info = str(input("输入服务端发送的信息:"))
    if "/" == page_name:
        page_name = "index"  # 默认的页面
    try:
        f = open(f"./{ 
     page_name}.html", "rb")   # 二进制文件
        html_file = f.read()
        f.close()
    except:
        header = "HTTP/1.1 404 NOT FOUND\r\n"  # 相应头部
        respone = "\r\n"  # 空行
        http_headr = header + respone + f"{ 
     page_name} not fount ,please again"
        tcp_socket.send(http_headr.encode("utf-8"))
    else:
        header = "HTTP/1.1 200 OK\r\n"  # 相应头部
        respone = "\r\n"  # 空行
        http_headr = header + respone

        http_body = html_file
        tcp_socket.send(http_headr.encode("utf-8"))
        tcp_socket.send(http_body)

    # tcp_socket.close()

def tcp_close(tcp_socket):
    tcp_socket.close()

def service_client(new_socket):
    # recv
    page_name = tcp_recv_message(tcp_socket=new_socket)

    # send
    tcp_send_message(tcp_socket=new_socket, page_name=page_name)



def CC_server():
    # 创建
    tcp_ser = tcp_creat_socket()

    # bind and listen
    ser_info = tcp_bind_listern_info(tcp_socket=tcp_ser)

    while True:  # 循环为多个客户端服务,一直处于监听状态
        new_socket = tcp_accept(tcp_socket=tcp_ser, ser_info=ser_info)

        th_client = threading.Thread(target=service_client,args=(new_socket,))  # 启动一个线程去执行客户端的服务,关闭在线程里面实现
        th_client.start()


    # close
    tcp_close(tcp_socket=tcp_ser)


if __name__ == "__main__":
    CC_server()

3.协程实现HTTP服务器的并发**

import socket
import re
import gevent
from gevent import monkey

""" TCP 的服务端 1,socket 创建socket 2.bind 绑定IP和端口 3.listen 处于监听状态 4.accept 接进来客户端的连接 5.recv/send 接受或者发送信息 6.close 关闭 """
monkey.patch_all()


def tcp_creat_socket():
    tcp_ser = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
    return tcp_ser


def tcp_bind_listern_info(tcp_socket):
    SER_IP = "127.0.0.1"
    # SER_PORT = int(input("服务器绑定的端口:"))
    SER_PORT = 7080
    SER_INFO = (SER_IP, SER_PORT)
    tcp_socket.bind(SER_INFO)

    LISTEN_NUM = 10
    tcp_socket.listen(LISTEN_NUM)
    return SER_INFO


def tcp_accept(tcp_socket,ser_info):
    # accept 1默认会阻塞,2并返回一个新的套接字用于和接进来的客户端进行数据传输,3并记录客户端的信息,为用户进行服务
    print("服务器的IP:%s,端口:%d,正在等待新的客户端的到来" % (ser_info[0], ser_info[1]))
    tcp_ser_new_socket, client_addr = tcp_socket.accept()
    print("客户端已经到来,信息如下:%s" % str(client_addr))
    return tcp_ser_new_socket


def tcp_recv_message(tcp_socket):
    # recv 返回值为空时,则客户端调用了close
    tcp_ser_recv_info = tcp_socket.recv(1024)
    if "exit" == tcp_ser_recv_info or None == tcp_ser_recv_info:
        print("recv_info error")

    # GET / HTTP/1.1
    # Host: www.baidu.com
    # Connection: keep-alive
    # sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"
    # sec-ch-ua-mobile: ?0

    print(">"*120)
    print("服务端接收:%s" % tcp_ser_recv_info.decode("utf-8").splitlines()[0])
    ret = re.match(r"[^/]+(/[^ ]*)", tcp_ser_recv_info.decode("utf-8").splitlines()[0])
    if ret:
        http_page_name = ret.group(1)
        return http_page_name


def tcp_send_message(tcp_socket, page_name):
    # send_info = str(input("输入服务端发送的信息:"))
    if "/" == page_name:
        page_name = "index"  # 默认的页面
    try:
        f = open(f"./{ 
     page_name}.html", "rb")   # 二进制文件
        html_file = f.read()
        f.close()
    except:
        header = "HTTP/1.1 404 NOT FOUND\r\n"  # 相应头部
        respone = "\r\n"  # 空行
        http_headr = header + respone + f"{ 
     page_name} not fount ,please again"
        tcp_socket.send(http_headr.encode("utf-8"))
    else:
        header = "HTTP/1.1 200 OK\r\n"  # 相应头部
        respone = "\r\n"  # 空行
        http_headr = header + respone

        http_body = html_file
        tcp_socket.send(http_headr.encode("utf-8"))
        tcp_socket.send(http_body)

def tcp_close(tcp_socket):
    tcp_socket.close()


def service_client(new_socket):
    # recv
    page_name = tcp_recv_message(tcp_socket=new_socket)

    # send
    tcp_send_message(tcp_socket=new_socket, page_name=page_name)


def CC_server():
    # 创建
    tcp_ser = tcp_creat_socket()

    # bind and listen
    ser_info = tcp_bind_listern_info(tcp_socket=tcp_ser)

    while True:  # 循环为多个客户端服务,一直处于监听状态
        new_socket = tcp_accept(tcp_socket=tcp_ser, ser_info=ser_info)
        gevent.spawn(service_client, new_socket)   # 直接进行传参即可

    # close
    tcp_close(tcp_socket=tcp_ser)


if __name__ == "__main__":
    CC_server()

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168450.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VBA编程基础和编程环境(二)

    VBA编程基础和编程环境(二)    上一节中认识了Excel宏的基本样子,明白了VBA就是一门类似于C、JAVA、Python等编程语言,了解了VBA与宏的关系,本节开始学习VBA编程的基础知识和编程环境,是整个学习编程的基础。    一、VBA编程的几个重要概念    0、过程    把VBA代码按照一定顺序和逻辑排列用来完成Excel某个任务的过程,其实就是用VBA代码按照先后…

    2022年6月7日
    36
  • jvm优化(二)JVM 内存大小设置

    jvm优化(二)JVM 内存大小设置Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机。Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对JavaJVM有关内存方面的知识进行详细介绍。一、JavaJVM内存介绍JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在Java虚拟

    2022年6月5日
    90
  • 贝叶斯定理

    贝叶斯定理条件概率和全概率在介绍贝叶斯定理之前,先简单地介绍一下条件概率,描述的是事件A在另一个事件B已经发生条件下的概率,记作 ,A和B可能是相互独立的两个事件,也可能不是: 表示A,B事件同时发生的概率,如果A和B是相互独立的两个事件,那么:上面的推导过程反过来证明了如果A和B是相互独立的事件,那么事件A发生的概率与B无关。稍微做一下改变:考虑到先验条件B…

    2022年6月1日
    54
  • 腾讯七大事业群_腾讯pcg事业群难进吗

    腾讯七大事业群_腾讯pcg事业群难进吗企业发展事业群(CorporateDevelopmentGroup,简称CDG)意如其名,企业发展事业群CDG在腾讯内部担当战略规划、投资者关系维护、业务孵化和投资并购等角色。众所周知的微信、财付通、QQ邮箱等业务均属CDG,诸多投资工作也由CDG负责,比如国内外投资并购、海外市场推广等工作,有志于股权投资、创新业务、国际化并拥有专长的同学可格外关注!互动娱乐事业群(I

    2022年9月14日
    1
  • quartus ii安装教程9.0激活成功教程教程_quartus ii 13.1安装教程

    quartus ii安装教程9.0激活成功教程教程_quartus ii 13.1安装教程一、首先是QuartusII13.0.1软件的下载如果你没有那么高的要求,用个低版本的QuartusII就足够了,而且低版本的软件比较稳定,为了免去大家找安装文件版本号不匹配的情况,我在这里把我所用的QuartusII13.0.1版本的源安装文件、激活成功教程文件和器件库(Cyclone,CycloneII,CycloneIII,CycloneIVdevices…

    2022年10月15日
    3
  • 史上最全的Java&Android面试题搜集整理

    史上最全的Java&Android面试题搜集整理最近在忙着准备面试,所以从全网搜集了一下java和android相关的面试题目,应该能够包含80%以上的试题吧~如果大家还有一些比较全面优质的题目资源,欢迎告知,我会继续补充进来,以便于更多同学可以从中获益。android性能优化系列 http://www.trinea.cn/android/performance/2016JAVA与Android面试题整理 http://www.no

    2022年5月21日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号