python 简单搭建阻塞式单进程,多进程,多线程服务的实例


Posted in Python onNovember 01, 2017

我们可以通过这样子的方式去理解apache的工作原理

1 单进程TCP服务(堵塞式)

这是最原始的服务,也就是说只能处理个客户端的连接,等当前客户端关闭后,才能处理下个客户端,是属于阻塞式等待

from socket import *
serSocket = socket(AF_INET, SOCK_STREAM)
#重复使用绑定的信息
serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1)

localAddr = ('', 7788)
serSocket.bind(localAddr)

serSocket.listen(5)

while True:
 print('-----?主进程,等待客户端连接??------')
 newSocket,destAddr = serSocket.accept()
 print('-----?.主进程,接下来负责数据处理[%s]-----'%str(destAddr))
 try:
  while True:
  recvData = newSocket.recv(1024)
  if len(recvData)>0:
   print('recv[%s]:%s'%(str(destAddr), recvData))
  else:
   print('[%s]客户端已经关闭?...'%str(destAddr))
  break
 finally:
  newSocket.close()

这种阻塞型自然不适合处理多客户端的请求,于是有了改版

2 多进程服务

采取多进程处理多客户端连接请求,对单进程进行了优化。

from socket import *
from multiprocessing import *
from time import sleep
# 处理客户端的请求并为其服务
def dealWithClient(newSocket,destAddr):
 while True:
  recvData = newSocket.recv(1024)
  if len(recvData)>0:
   print('recv[%s]:%s'%(str(destAddr), recvData))
  else:
   print('[%s]客户端已经关闭'%str(destAddr))
   break
 newSocket.close()
def main():
 serSocket = socket(AF_INET, SOCK_STREAM)
 serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1)
 localAddr = ('', 7788)
 serSocket.bind(localAddr)
 serSocket.listen(5)
 try:
  while True:
  print('-----主进程,,等待新客户端的到来------')
  newSocket,destAddr = serSocket.accept()
  print('-----主进程,,接下来创建.个新的进程负责数据处理[%s]-----'
  client = Process(target=dealWithClient, args=(newSocket,destAddr))
  client.start()
  #因为已经向.进程中copy了.份(引.),并且.进程中这个套接字也没有用处了
  #所以关闭
  newSocket.close()
 finally:
  #当为所有的客户端服务完之后再进.关闭,表示不再接收新的客户端的链接
  serSocket.close()
 if __name__ == '__main__':
  main()

通过为每个客户端创建一个进程的方式,能够同时为多个客户端进行服务;当客户端不是特别多的时候,这种方式还行,如果有成百上千个,就不可取了,因为每次创建进程都消耗较多的资源,于是有了改进版

3 多线程服务

采用多线程处理多客户端连接请求,由于线程共享资源,不用像进程那样复制出多个资源,因此处理更快。

#coding=utf-8
from socket import *
from threading import Thread
from time import sleep

# 处理客户端的请求并执行
def dealWithClient(newSocket,destAddr):
 while True:
  recvData = newSocket.recv(1024)
  if len(recvData)>0:
   print('recv[%s]:%s'%(str(destAddr), recvData))
  else:
   print('[%s]客户端已经关闭'%str(destAddr))
   break
 newSocket.close()

def main():
 serSocket = socket(AF_INET, SOCK_STREAM)
 serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1)
 localAddr = ('', 7788)
 serSocket.bind(localAddr)
 serSocket.listen(5)
 try:
  while True:
   print('-----主进程,,等待新客户端的到来------')
   newSocket,destAddr = serSocket.accept()
   print('-----主进程,,接下来创建.个新的进程负责数据处理[%s]-----'
   client = Thread(target=dealWithClient, args=(newSocket,destAddr))
   client.start()

   #这里不要关闭,线程共享资源,关闭了会导致全部线程均关闭
   #newSocket.close()
 finally:
  serSocket.close()
if __name__ == '__main__':
main()

以上这篇python 简单搭建阻塞式单进程,多进程,多线程服务的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python多线程编程(五):死锁的形成
Apr 05 Python
使用70行Python代码实现一个递归下降解析器的教程
Apr 17 Python
详解Python文本操作相关模块
Jun 22 Python
python使用Tkinter实现在线音乐播放器
Jan 30 Python
python 2.7.13 安装配置方法图文教程
Sep 18 Python
python 画三维图像 曲面图和散点图的示例
Dec 29 Python
基于python连接oracle导并出数据文件
Apr 28 Python
构建高效的python requests长连接池详解
May 02 Python
在python image 中实现安装中文字体
May 16 Python
一篇文章搞懂python的转义字符及用法
Sep 03 Python
python3.9.1环境安装的方法(图文)
Feb 02 Python
Python中使用tkFileDialog实现文件选择、保存和路径选择
May 20 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
Nov 01 #Python
Python栈算法的实现与简单应用示例
Nov 01 #Python
Python scikit-learn 做线性回归的示例代码
Nov 01 #Python
机器学习python实战之手写数字识别
Nov 01 #Python
Python定时器实例代码
Nov 01 #Python
机器学习python实战之决策树
Nov 01 #Python
详解Python开发中如何使用Hook技巧
Nov 01 #Python
You might like
UCenter Home二次开发指南
2009/05/28 PHP
php getsiteurl()函数
2009/09/05 PHP
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
浅谈PHP与C#的值类型指向区别的详解
2013/05/21 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
2013/06/20 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
2014/03/19 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
详解将数据从Laravel传送到vue的四种方式
2019/10/16 PHP
laravel框架学习笔记之组件化开发实现方法
2020/02/01 PHP
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
深入分析下javascript中的[]()+!
2015/07/07 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
2015/12/03 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
js HTML5手机刮刮乐代码
2020/09/29 Javascript
详细讲解JavaScript中的this绑定
2016/10/10 Javascript
完美解决input[type=number]无法显示非数字字符的问题
2017/02/28 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
vue组件父子间通信之综合练习(聊天室)
2017/11/07 Javascript
vue使用laydate时间插件的方法
2018/11/14 Javascript
js 根据对象数组中的属性进行排序实现代码
2019/09/12 Javascript
JavaScript this在函数中的指向及实例详解
2019/10/14 Javascript
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
Python 数据可视化pyecharts的使用详解
2019/06/26 Python
Python爬虫程序架构和运行流程原理解析
2020/03/09 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
HTML5的标签的代码的简单介绍 HTML5标签的简介
2012/05/28 HTML / CSS
计算机专业个人求职自荐信
2013/09/21 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB
Python 匹配文本并在其上一行追加文本
2022/05/11 Python