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 07 Python
Django中URL视图函数的一些高级概念介绍
Jul 20 Python
Python实现的基数排序算法原理与用法实例分析
Nov 23 Python
python 利用栈和队列模拟递归的过程
May 29 Python
Python+OpenCV感兴趣区域ROI提取方法
Jan 10 Python
Python创建字典的八种方式
Feb 27 Python
详解python-图像处理(映射变换)
Mar 22 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
Aug 22 Python
Django框架反向解析操作详解
Nov 28 Python
Django 解决开发自定义抛出异常的问题
May 21 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
Jul 07 Python
Django实现简单的分页功能
Feb 22 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实现多服务器session共享之NFS共享的方法
2007/03/16 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
2015/07/06 PHP
yii2使用ajax返回json的实现方法
2016/05/14 PHP
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
JS中prototype关键字的功能介绍及使用示例
2013/07/21 Javascript
js数组操作学习总结
2013/11/04 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
js实现仿网易点击弹出提示同时背景变暗效果
2015/08/13 Javascript
学习JavaScript设计模式(多态)
2015/11/25 Javascript
javascript类型系统 Array对象学习笔记
2016/01/09 Javascript
Jquery+ajax+JAVA(servlet)实现下拉菜单异步取值
2016/03/23 Javascript
PassWord输入框代码分享
2016/06/07 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
vue 获取元素额外生成的data-v-xxx操作
2020/09/09 Javascript
python根据距离和时长计算配速示例
2014/02/16 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
2016/06/29 Python
Python利用operator模块实现对象的多级排序详解
2017/05/09 Python
python 计算平均平方误差(MSE)的实例
2019/06/29 Python
django ModelForm修改显示缩略图 imagefield类型的实例
2019/07/28 Python
Python 使用多属性来进行排序
2019/09/01 Python
Python3 无重复字符的最长子串的实现
2019/10/08 Python
通过实例学习Python Excel操作
2020/01/06 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
美国摩托车头盔、零件、齿轮及配件商店:Cycle Gear
2019/06/12 全球购物
Python中pass语句的作用是什么
2016/06/01 面试题
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
会计专业导师推荐信
2014/03/08 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
护士工作失误检讨书
2014/09/14 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
有关朝花夕拾的读书笔记
2015/06/29 职场文书
大学生社会实践感想
2015/08/11 职场文书
python如何正确使用yield
2021/05/21 Python