zoukankan      html  css  js  c++  java
  • 使用池实现并发服务器

    进程池线程池并发服务器

    # -*- coding: utf-8 -*-
    """ 进程池和线程池实现并发
        socket编程共两个阻塞的地方,生成对等套接字和接收数据
        1.将生成对等套接字给进程池
        2.将接收数据交给线程池(进程池中)
     """
    from multiprocessing.pool import ThreadPool
    from multiprocessing import Pool, cpu_count # 获取机器cpu数量
    
    import socket
    
    
    def process_worker(server):
        thread_pool = ThreadPool(4)
        while True:
            conn, addr = server.accept() # 对等连接套接字
            thread_pool.apply_async(thread_worker, args=(conn, ))
        # thread_pool.join()
    
    def thread_worker(conn):
        while True:
            recv_data = conn.recv(1024)
            if recv_data:
                print(recv_data.decode())
                conn.send(recv_data)
            else:
                conn.close()
                break
    
    def main():
        server = socket.socket()
        server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 释放端口
        server.bind(("", 8000))
        server.listen(1000)  # 监听套接字
    
        pool = Pool(cpu_count())  # 生成进程池
    
        for i in range(cpu_count()):
            pool.apply_async(process_worker, args=(server, ))
        pool.close()
        print('apply is starting!!!')
        pool.join()
    
    if __name__ == "__main__":
        main()

    奇怪的是在windows下运行出错,在linux没出错。

        recv_data = client.recv(1024) # 该处出错
    ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接。
  • 相关阅读:
    C++ fstream 用法
    Servlet详解(转)
    JSP&Servlet(转)
    我们工作是为了什么!
    常见C C++问题(转)
    一份诚恳的互联网找工作总结和感想(附:怎样花两年时间去面试一个人)
    第一篇
    洛谷p1064 金明的预算方法
    onload、DOMContentLoaded与性能问题
    jsbin本地部署
  • 原文地址:https://www.cnblogs.com/tangpg/p/10644821.html
Copyright © 2011-2022 走看看