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的活
  • 相关阅读:
    [计算机网络-传输层] 无连接传输:UDP
    [BinaryTree] 最大堆的类实现
    [OS] 生产者-消费者问题(有限缓冲问题)
    [剑指Offer] 64.滑动窗口的最大值
    [剑指Offer] 63.数据流中的中位数
    [剑指Offer] 62.二叉搜索树的第k个结点
    [OS] CPU调度
    [剑指Offer] 60.把二叉树打印成多行
    MySQL数据库实验二:单表查询
    数据库实验:基本表的定义与修改
  • 原文地址:https://www.cnblogs.com/stin/p/8547989.html
Copyright © 2011-2022 走看看