• (23)socket多进程并发


    # 对于服务器自己本身,一个程序只能绑定一个端口

    # 同一个端口可以多个客户端来连接,

    # 只要server_ip+ server_port +client_ip + cilent_port 不一样,就是唯一

    客户端我这里只写一个,基本大同小异,下面的都是服务端的

    client:

    import socket
    sk = socket.socket()
    sk.connect(('127.0.0.1',9000))
    while True:
        print(sk.recv(1024))
        sk.send(b'bye')
    sk.close()
    View Code

    (1) Process模块开子进程实现

    server:

    import socket
    from multiprocessing import Process
    
    def communicate(conn):
        while True:
            conn.send(b'hello')
            print(conn.recv(1024))
    if __name__ == "__main__":
        sk = socket.socket()
        # 对于服务器自己本身,一个程序只能绑定一个端口
        # 同一个端口可以多个客户端来连接,
        # 只要server_ip+ server_port +client_ip + cilent_port 不一样,就是唯一
        sk.bind(("127.0.0.1", 9000))
        sk.listen()
        while True:
            conn, addr = sk.accept()
            Process(target=communicate, args=(conn,)).start()
    View Code

    执行效果图:同时可以连接多个客户端

    (2)socketserver模块实现

    功能:实现TCP同时连接多个客户端

    并发:一个cpu同时不停地执行多个程序

    server:

    import socketserver
    
    
    # 自定义一个类 MyServer
    class MyServer(socketserver.BaseRequestHandler):
        # handle 方法是每当有一个客户端发起connect来接之后,自动执行handle
        def handle(self):
            # self.request  # 相当于conn
            # self.client_address # 相当于addr
            conn = self.request
            while True:
                print(conn.recv(1024))
                conn.send(b'hello')
    #  避免端口报错
    socketserver.TCPServer.allow_reuse_address = True
    # ip 端口号  |  自定义类
    server = socketserver.ThreadingTCPServer(("127.0.0.1", 9000), MyServer)
    # 循环调用
    server.serve_forever()
    View Code

    (3) 进程池实现

    server:

    import socket
    from multiprocessing import Pool
    def talk(conn):
        while True:
            conn.send(b"hello")
            print(conn.recv(1024))
        conn.close()
    if __name__ == "__main__":
        sk = socket.socket()
        sk.bind(("127.0.0.1", 9000))
        sk.listen()
        # Pool默认获取cpu_counter cpu最大核心数 我的机器是6
        p = Pool()
        while True:
            conn, addr = sk.accept()
            p.apply_async(talk, args=(conn,))
        sk.close()
    View Code

    (4) 多线程实现

    server:

    import socket
    from threading import Thread
    def func(conn):
        while True:
            conn.send(b"hello")
            print(conn.recv(1024))
        conn.close()
    if __name__ == '__main__':
        sk = socket.socket()
        sk.bind(('127.0.0.1',9000))
        sk.listen()
        while True:
            conn,addr = sk.accept()
            t = Thread(target=func,args=(conn,))
            t.start()
        sk.close()
    View Code

    (5) 协程实现 gevent

    server:

    from gevent import monkey; monkey.patch_all()
    import socket
    import gevent
    import os 
    from threading import current_thread as cthread
    import time
    
    def talk(conn):
        while True:
            print(cthread().ident,os.getpid())
            time.sleep(0.1)
            conn.send(b'hello')
            print(conn.recv(1024))
    
    sk = socket.socket()
    sk.bind( ("127.0.0.1" ,9000))
    sk.listen()
    
    # 用一个线程接受了所有访问的连接.(因为利用了协程)
    while True:
        conn,addr = sk.accept()
        # spawn 和 submit 用法一样 参数默认往后写就可以了
        gevent.spawn(talk,conn)
    View Code

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    JQuery的学习笔记
    Ajax的学习笔记
    软件项目的托管平台gitHub
    滚动事件:document.body.scrollTop总是0的原因
    Less/Sass编译工具,koala使用指南
    CSS中的浮动和清除浮动,梳理一下
    PHP_GET数据获取
    php中header()
    服务端web开发:PHP简介以及常见语法
    C/S架构和B/S架构
  • 原文地址:https://www.cnblogs.com/lyj910313/p/10787430.html
Copyright © 2020-2023  润新知