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外星人入侵游戏编程完整版
Mar 30 Python
Python实现的破解字符串找茬游戏算法示例
Sep 25 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
Dec 12 Python
python 实现人和电脑猜拳的示例代码
Mar 02 Python
简单介绍一下pyinstaller打包以及安全性的实现
Jun 02 Python
QML用PathView实现轮播图
Jun 03 Python
pandas参数设置的实用小技巧
Aug 23 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
Nov 09 Python
使用numpngw和matplotlib生成png动画的示例代码
Jan 24 Python
Python 调用C++封装的进一步探索交流
Mar 04 Python
PyQt 如何创建自定义QWidget
Mar 24 Python
分享Python异步爬取知乎热榜
Apr 12 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
php多文件上传实现代码
2014/02/20 PHP
php 删除cookie方法详解
2014/12/01 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
TP3.2.3框架文件上传操作实例详解
2020/01/23 PHP
window.open()弹出居中的窗口
2007/02/01 Javascript
Dom在ajax技术中的作用说明
2010/10/25 Javascript
JavaScript实现的使用键盘控制人物走动实例
2014/08/27 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
2016/06/05 Javascript
BootStrap tab选项卡使用小结
2020/08/09 Javascript
js前端解决跨域问题的8种方案(最新最全)
2016/11/18 Javascript
vue中的ref和$refs的使用
2018/11/22 Javascript
JS实现求5的阶乘示例
2019/01/21 Javascript
vue 中 beforeRouteEnter 死循环的问题
2019/04/23 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
2020/05/19 Javascript
Python MD5文件生成码
2009/01/12 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
对python:threading.Thread类的使用方法详解
2019/01/31 Python
Python正则表达式和re库知识点总结
2019/02/11 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
2019/07/06 Python
Python解析命令行读取参数之argparse模块
2019/07/26 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
keras做CNN的训练误差loss的下降操作
2020/06/22 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
基于第一个PhoneGap(cordova)的应用详解
2013/05/03 HTML / CSS
AmazeUI 等分网格的实现示例
2020/08/25 HTML / CSS
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
一个J2EE项目团队的主要人员组成是什么
2012/06/04 面试题
土木工程毕业生推荐信
2013/10/28 职场文书
小学教师师德师风演讲稿
2014/08/22 职场文书
家长学校教学计划
2015/01/19 职场文书
民事诉讼答辩状范文
2015/05/21 职场文书