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

服务端代码

import json
import struct
import socket
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 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 = 3for i in range(process_nums):p = multiprocessing.Process(target=process_request, 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()

示例代码中开启了 3 个进程,如果客户端请求数量大于 3 那么多余的请求就会阻塞,直到之前的客户端请求关闭后,新的请求才会处理。

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

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

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

  2. 嵌入式课程设计:socket通信模拟服务器客户端实现文件传送(基于c++语言)

            本次课程设计时间大概是两天半,磕磕碰碰,一路上遇到了很多的问题,也不断的查资料,想办法解决各种拦路的BUG,最后做出来的效果自己还是挺满意的,能够实现多台电脑之间模拟服务端,客户端,进 ...

  3. socket服务器文件名和客户端一致,缘分锝天空的博客:嵌入式课程设计:socket通信模拟服务器客户端...

    #include //#include #include #include #include #pragma comment(lib,"ws2_32.lib") using nam ...

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

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

  5. 微信h5棋牌架设多线程,多进程服务器的实现

    微信h5棋牌架设(aqiulian.com)多线程,多进程服务器的实现,完整的微信h5棋牌架设,搭建教程联系方式: QQ:212303635. socket 在TCP/IP协议中,"IP地址 ...

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

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

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

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

  8. 笔记2:VC++ socket通信实例

    VC++ socket通信实例 网络中进程之间如何通信   首要解决的问题是如何唯一标识一个进程,在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们 ...

  9. Socket通信---网络通信学习笔记(一)

    两台计算机进行通信的基本前提: (1)IP地址: 每台计算机都有自己独一无二的IP地址,根据IP地址判断与哪台计算机进行通信. (2)端口号: 每个应用程序都有自己专属的端口,根据端口号判断与计算机中 ...

  10. Android开发笔记(一百一十一)聊天室中的Socket通信

    Socket通信 基本概念 对于程序开发来说,网络通信的基础就是Socket,但因为是基础,所以用起来不容易,今天我们就来谈谈Socket通信.计算机网络有个大名鼎鼎的TCP/IP协议,普通用户在电脑 ...

最新文章

  1. python实现将txt文件格式转换为arff格式
  2. VMware下安装的CentOS 7如何配置IP地址并能与Windows物理机ping通
  3. python实习做什么工作-实习工作 - python挖掘 - 博客园
  4. 全面分析 Spring 的编程式事务管理及声明式事务管理(转)
  5. 企业存储管理的另一种可能 群晖如何成为NAS代名词?
  6. NDK(三方库引入、Mk文件)
  7. 【BZOJ 3229】 3229: [Sdoi2008]石子合并 (GarsiaWachs算法)
  8. 超详细前端开发案例:品优购商场项目(三)
  9. java case 语句_ECMAScript switch 语句
  10. 对称加密算法和非对称加密算法介绍
  11. Lucene: 全文检索的基本原理
  12. Linux 内核C -- 第02课:驱动中的指定初始化
  13. Erstudio8.0怎么用?Erstudio8.0汉化版详细使用教程
  14. WebStorm之如何清除缓存
  15. html中图片椭圆,CSS3技巧之形状(椭圆)
  16. SAS,软件使用中reg报错/gplot错误的解决方法。
  17. Python3脚本抢票
  18. 腾讯多媒体实验室:基于三维卷积神经网络的全参考视频质量评估算法
  19. Linux~~~网络管理实战1-2020.12.6
  20. RePlugin集成AndroidAutoSize

热门文章

  1. 2022-2028年中国分散式风电行业投资分析及前景预测报告
  2. python中如何对复杂的json数据快速查找key对应的value值(使用JsonSearch包)
  3. tryexceptelse可以嵌套
  4. 如何运行具有奇点的NGC深度学习容器
  5. Python:urllib2模块Handler处理器 和 自定义Opener
  6. Python数据挖掘:数据探索,数据清洗,异常值处理
  7. mysql 5.7笔记_关于MySql 5.7.29免安装版本的一个笔记
  8. Resource entery xx is already defined
  9. Android startActivityForResult()的用法
  10. [CF888G]Xor-MST