RPC 笔记(08)— socket 通信(多进程多线程服务器)
在上一节中如果并行的客户端连接数超过了默认开启进程的数量,那么后来的客户端请求将会阻塞,为了不阻塞新的客户端,我们可以将进程的单线程改成多线程即可。
服务端代码:
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 通信(多进程多线程服务器)相关推荐
- RPC 笔记(06)— socket 通信(多线程服务器)
1. 客户端代码 import json import time import struct import socketdef send_request(sock_obj, method, param ...
- python 实现TCP socket通信和 HTTP服务器、服务器和客户端通信python实例
python 实现TCP socket通信和 HTTP服务器.服务器和客户端通信实例 socket是什么? 服务器和客户端通信的流程 python 实现TCP socket通信例子 关于Host和PO ...
- python socket通信 多进程_python实现多进程通信实例分析
操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...
- RPC 笔记(05)— socket 通信(单线程服务器)
1. Python 标准库 1.1 socket 提供 RPC 服务的网络通信功能,方便用户编写 tcp/udp 相关的代码.两个不同机器的进程需要通信时,可以通过 socket 来传输数据. 客 ...
- 回调函数 线程_从0实现基于Linux socket聊天室-多线程服务器一个很隐晦的错误-2...
根据 <0 基于socket和pthread实现多线程服务器模型>所述,server创建子线程的时候用的是以下代码: pconnsocke = (int *) malloc(sizeof( ...
- Linux实现多进/线程并发服务端Socket通信
Linux实现多进/线程并发服务端Socket通信 多进程并发服务端 程序流程 服务端程序 客户端程序 运行结果 多线程并发服务端 程序流程 服务端程序 客户端程序 运行结果 附录(错误处理函数封装) ...
- Android中socket通信简单实现
Android中socket通信简单实现 socket通信需要有一个服务器和客户端,可以把同一个APP作为服务器跟客户端,也可以分开成两个APP. 先上个图: 这里以一个APP作为服务器跟客户端为示例 ...
- RPC 笔记(07)— socket 通信(多进程服务器)
上节我们完成了一个简单的多线程服务器,可以并发处理多个客户端连接.但是 Python 由于全局解释器锁 GIL 的存在,致使多个线程只能占满一个 CPU 核心,多线程并不能充分利用多核的优势.所以多数 ...
- 【Linux网络编程学习】使用socket实现简单服务器——多进程多线程版本
此为牛客Linux C++课程和黑马Linux系统编程笔记. 1. 多进程版 1.1 思路 大体思路与上一篇的单进程版服务器–客户端类似,都是遵循下图: 多进程版本有以下几点需要注意: 由于TCP是点 ...
最新文章
- sql: TRIGGER
- linux+用户的shell,linux更换用户_更改linux用户登录shell的方法
- 编译原理 —— 1.2 编译系统的结构(终于弄懂语法和语义的区别了!)
- Python中字符串的连接
- Spring Boot 注解描述
- uvalive 6932
- 软件的开发模型之瀑布型和快速原型
- 强化学习:确定性策略梯度(DDPG)
- omitting directory * 问题解决
- openpose vs2015 cuda8.0 cudnn5.0 TiTan xp 环境配置
- 比你拼命的人多的是,最可怕的是比你牛的人比你还拼命。。。励志
- win10照片查看器_19个Win10使用小技巧,看看你知道哪些?
- Http简介(关于HTTP请求GET和POST的区别)
- python爬虫翻页代码 豆瓣_Python爬虫 豆瓣动态页面的爬取
- 刚刚,2022中国大学工科排名出炉
- 翻斗式雨量计:用数据说话,倾盆大雨的“盆”到底有多大?
- learnOpenGL-混合
- cookie的写和读
- 清华计算机专业课程列表
- 回文字(牛客竞赛题解)