zoukankan      html  css  js  c++  java
  • 多进程或多线程实现并发

    多线程实现并发:

    from socket import *
    from threading import Thread
    
    
    def talk(conn):
        while True:
            try:
                data = conn.recv(1024)
                if not data: break
                conn.send(data.upper())
            except ConnectionResetError:
                break
        conn.close()
    
    
    def server(ip,port): # 来一个客户端,起一个conn
        server = socket(AF_INET, SOCK_STREAM)
        server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        server.bind((ip, port))
        server.listen(5)
    
        while True:
            conn,addr = server.accept()
            t = Thread(target=talk,args=(conn,))  # 子线程响应每个conn
            t.start()
        server.close()
    
    if __name__ == '__main__':
        server('127.0.0.1',8087)  # 主线程干起server的活

    多进程实现并发:

    from socket import *
    from multiprocessing import Process
    
    
    def talk(conn):
        while True:
            try:
                data = conn.recv(1024)
                if not data: break
                conn.send(data.upper())
            except ConnectionResetError:
                break
        conn.close()
    
    
    def server(ip,port): # 来一个客户端,起一个conn
        server = socket(AF_INET,SOCK_STREAM)
        server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        server.bind((ip, port))
        server.listen(5)
        while True:
            conn,addr = server.accept()
            p = Process(target=talk,args=(conn,))  # 响应每个conn
            p.start()
        server.close()
    
    if __name__ == '__main__':
        server('127.0.0.1',8080)

    缺点:无限的开进程线程,会导致服务端崩溃。

    可用进程池线程池替代。

    def server(ip,port): # 来一个客户端,起一个conn
        server = socket(AF_INET, SOCK_STREAM)
        server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        server.bind((ip, port))
        server.listen(5)
    
        while True:
            conn,addr = server.accept()
            pool.submit(talk,conn)   # 每来一个conn,提交到线程池
        server.close()
    
    if __name__ == '__main__':
        pool = ThreadPoolExecutor(2)
        server('127.0.0.1',8087)  # 主线程干起server的活
  • 相关阅读:
    手机号码 正则表达式
    邮政编码的正则表达式
    对象为null,调用非静态方法产生空指针异常
    文件找不到异常(FileNotFoundException)
    数组下标越界异常解决方法
    空指针异常的解决方法
    需求:打印九九乘法表
    创建简单线程
    ·博客作业06--图
    博客作业05--查找
  • 原文地址:https://www.cnblogs.com/stin/p/8547989.html
Copyright © 2011-2022 走看看