在上一节中如果并行的客户端连接数超过了默认开启进程的数量,那么后来的客户端请求将会阻塞,为了不阻塞新的客户端,我们可以将进程的单线程改成多线程即可。

服务端代码:

import json
import struct
import socket
import threading
import multiprocessingdef handle_conn(conn, ip, handlers):print("{} connect ...".format(ip))# 循环读写while True:length_prefix = conn.recv(4)  # 请求长度前缀if not length_prefix:         # 连接关闭了conn.close()print("{} close ...".format(ip))break  # 退出循环,处理下一个连接length, = struct.unpack("I", length_prefix)body = conn.recv(length)  # 请求消息体request = json.loads(body)client_method = request['client']client_parameter = request['params']print("client request method is {}, params is {}".format(client_method, client_parameter))handler = handlers[client_method]  # 查找请求处理器handler(conn, client_parameter)  # 处理请求def process_request(sock, handlers):while True:conn, host_ip = sock.accept()  # 接收连接handle_conn(conn, host_ip, handlers)  # 处理连接def multi_thread(sock, handlers):threads = []thread_nums = 2for i in range(thread_nums):t = threading.Thread(target=process_request, args=(sock, handlers))threads.append(t)for i in range(thread_nums):threads[i].start()for i in range(thread_nums):threads[i].join()def func1(conn, params):res = json.dumps({"response": "OK", "result": params})  # 响应消息体length_prefix = struct.pack("I", len(res))  # 响应长度前缀conn.sendall(length_prefix)# conn.sendall(response)  # python2conn.sendall(str.encode(res))  # python3def main():s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建一个 TCP 套接字s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 打开 reuse addr 选项s.bind(("localhost", 8080))  # 绑定端口s.listen(1)  # 监听客户端连接handlers = {"func1": func1    # 注册请求处理器}# process_request(s, handlers)  # 进入服务循环process = []process_nums = 2for i in range(process_nums):p = multiprocessing.Process(target=multi_thread, args=(s, handlers))process.append(p)for i in range(process_nums):process[i].start()for i in range(process_nums):process[i].join()if __name__ == '__main__':main()

示例代码中开启 2 个进程,每个进程中又开了 2 个线程,那么此时最多可以同时开启 4 个客户端,超过 4 个客户端后多余的请求会被阻塞处理。

RPC 笔记(08)— socket 通信(多进程多线程服务器)相关推荐

  1. RPC 笔记(06)— socket 通信(多线程服务器)

    1. 客户端代码 import json import time import struct import socketdef send_request(sock_obj, method, param ...

  2. python 实现TCP socket通信和 HTTP服务器、服务器和客户端通信python实例

    python 实现TCP socket通信和 HTTP服务器.服务器和客户端通信实例 socket是什么? 服务器和客户端通信的流程 python 实现TCP socket通信例子 关于Host和PO ...

  3. python socket通信 多进程_python实现多进程通信实例分析

    操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...

  4. RPC 笔记(05)— socket 通信(单线程服务器)

    1. Python 标准库 1.1 socket 提供 RPC 服务的网络通信功能,方便用户编写 tcp/udp 相关的代码.两个不同机器的进程需要通信时,可以通过 socket 来传输数据. ​ 客 ...

  5. 回调函数 线程_从0实现基于Linux socket聊天室-多线程服务器一个很隐晦的错误-2...

    根据 <0 基于socket和pthread实现多线程服务器模型>所述,server创建子线程的时候用的是以下代码: pconnsocke = (int *) malloc(sizeof( ...

  6. Linux实现多进/线程并发服务端Socket通信

    Linux实现多进/线程并发服务端Socket通信 多进程并发服务端 程序流程 服务端程序 客户端程序 运行结果 多线程并发服务端 程序流程 服务端程序 客户端程序 运行结果 附录(错误处理函数封装) ...

  7. Android中socket通信简单实现

    Android中socket通信简单实现 socket通信需要有一个服务器和客户端,可以把同一个APP作为服务器跟客户端,也可以分开成两个APP. 先上个图: 这里以一个APP作为服务器跟客户端为示例 ...

  8. RPC 笔记(07)— socket 通信(多进程服务器)

    上节我们完成了一个简单的多线程服务器,可以并发处理多个客户端连接.但是 Python 由于全局解释器锁 GIL 的存在,致使多个线程只能占满一个 CPU 核心,多线程并不能充分利用多核的优势.所以多数 ...

  9. 【Linux网络编程学习】使用socket实现简单服务器——多进程多线程版本

    此为牛客Linux C++课程和黑马Linux系统编程笔记. 1. 多进程版 1.1 思路 大体思路与上一篇的单进程版服务器–客户端类似,都是遵循下图: 多进程版本有以下几点需要注意: 由于TCP是点 ...

最新文章

  1. sql: TRIGGER
  2. linux+用户的shell,linux更换用户_更改linux用户登录shell的方法
  3. 编译原理 —— 1.2 编译系统的结构(终于弄懂语法和语义的区别了!)
  4. Python中字符串的连接
  5. Spring Boot 注解描述
  6. uvalive 6932
  7. 软件的开发模型之瀑布型和快速原型
  8. 强化学习:确定性策略梯度(DDPG)
  9. omitting directory * 问题解决
  10. openpose vs2015 cuda8.0 cudnn5.0 TiTan xp 环境配置
  11. 比你拼命的人多的是,最可怕的是比你牛的人比你还拼命。。。励志
  12. win10照片查看器_19个Win10使用小技巧,看看你知道哪些?
  13. Http简介(关于HTTP请求GET和POST的区别)
  14. python爬虫翻页代码 豆瓣_Python爬虫 豆瓣动态页面的爬取
  15. 刚刚,2022中国大学工科排名出炉
  16. 翻斗式雨量计:用数据说话,倾盆大雨的“盆”到底有多大?
  17. learnOpenGL-混合
  18. cookie的写和读
  19. 清华计算机专业课程列表
  20. 回文字(牛客竞赛题解)

热门文章

  1. Go语言的错误异常处理机制及其应用
  2. java action dao_java中Action层、Service层和Dao层的功能区分
  3. Lampiao靶机渗透测试
  4. python 如何获取当前系统的时间
  5. 算法精解:DAG有向无环图
  6. LeetCode简单题之赎金信
  7. 操作系统学习笔记 第四章:存储器管理(王道考研)
  8. Go语言环境搭建(Windows+Linux)
  9. TVM 高效保护隐私 ML
  10. HiCar SDK概述