• 用进程池和线程池实现高并发服务器


    思想:

      1.  创建与服务器相同cpu个数的进程个数来监听(accept)客户端响应,并在每个进程中先创建好一个线程池

      2.  有客户端访问时,解除其中一个进程的accpet阻塞,进入到线程中来执行接收数据工作( recv() ),用线程防止recv阻塞,线程调用recv方法

      3.  main主函数调用时,最后要加pool.close()和pool.join

    代码:

    import socket
    from multiprocessing import Pool,cpu_count
    from multiprocessing.pool import ThreadPool

    def worker_process(server): #处理server进程
    thread_pool = ThreadPool(cpu_count()) #每个进程开一个线程池
    while True:
    conn,addr = server.accept()
    thread_pool.apply_async(worker_recv,args=(conn,))

    def worker_recv(conn): #在线程中处理
    while True:
    data = conn.recv(1024)
    if data:
    print(data.decode())
    conn.send(data)
    else:
    conn.close()

    if __name__ == '__main__':
    server = socket.socket()
    server.bind(('127.0.0.1', 7778))
    server.listen(1000)

    n = cpu_count() #本机的cpu个数
    pool = Pool(n)
    for i in range(n):
    pool.apply_async(worker_process,args=(server,))

    pool.close()
    pool.join()

    图例:

      

  • 相关阅读:
    测试用例的设计
    测试经理的职责
    如果开发认为这不是bug,对QA来说应该怎么处理?
    我选择测试的过程
    API的知识点
    测试人员需要的技能
    时区转换的计算方式
    学习能力的必需
    制图工具
    JSON序列和反序列1
  • 原文地址:https://www.cnblogs.com/cxhzy/p/10007035.html
Copyright © 2020-2023  润新知