方案3: 改变系统架构

在开始多进程之前,先简单说明一下python GIL, 之前自己对他也有些误解。因为python GIL的机制存在,同时运行的线程只有一个,但这个线程在不同时刻可以运行在不同的核上,这个调度是由操作系统完成的,如果你写个死循环,开的线程足够多,是可以把整个系统的CPU消耗干净的,此时你在Linux下通过top可以看到,us 占用的CPU不大,但sy占用的CPU会很大,CPU主要消耗在系统调度上了。下面是测试代码,大家可以试试。

import threading

class MultipleThread(threading.Thread):

def __init__(self):

threading.Thread.__init__(self)

def run(self):

while 1:

print "here"

for i in xrange(100):

multiple_thread=MultipleThread()

multiple_thread.start()

multiple_thread.join()

既然因为GIL的存在,同时只能运行一个线程,那多线程可以提高效率,当然可以!开个3-4个线程可以明显的提高性能,大概能提高个2-3倍左右吧,但继续增加线程就是副作用了。

系统多线程的系统架构:

发送和接受都不存在瓶颈,主要瓶颈在在红线部分,decode和 encode部分。多线程改成多进程比较简单,工作量不大,只要把需要多进程共享的信息,由Queue改成multiprocessing.Queue()就可以了,把继承的DiameterMsgParser(threading.Thread)改成DiameterMsgParser(multiprocessing.Process),有个比较麻烦的是log的输出,python自带的logging模块在多进程下写同一个文件会引起混乱。这个在后面单独说明。

import multiprocessing

import logging

class Worker(multiprocessing.Process):

def __init__(self,mp_name,input_queue):

multiprocessing.Process.__init__(self,name=mp_name)

self.input_queue=input_queue

def run(self):

for i in xrange(100):

self.input_queue.put_nowait(i)

logging.debug("test "+str(i))

多线程改成多进程后,在sunfire 4170 (16 core , 2.4G ) 上能支持到5000 meesages (双向), CPU占有率 30-40%,用的是标准的python2.7,因为在solaris上没安装成功pypy,所以在此机器上,我没有测试pypy对性能影响多大。但我在一个2核的linux机器上测试python和 pypy,在多进程的情况下的效率,pypy对效率的提升没有达到倍数的级别,没找到什么原因, 后面有CPU核数比较多的机器再测试下。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言之Python!

python 系统架构_Python之优化系统架构的方案相关推荐

  1. python安装系统要求_python需要什么系统 | window重装系统教程

    python的spyder怎么打开,或者具体的安装教程 1.spyder 打https://pypi.python.org/pypi/spyder 下载里面最新的源码zip包,在解压后,cmd里cd到 ...

  2. python用户登录_python用户登录系统

    本文实例为大家分享了用户登录系统python实现代码,供大家参考,具体内容如下 注意事项: 1.使用python3执行程序.按提示输入1或2,登录或退出程序 2.输入用户名后,如果用户名被锁定及无效用 ...

  3. python前端用什么架构_Python web世界观——web架构概览(适合传统软件工程师)...

    Python web世界观--web架构概览(适合传统程序员) 传统web server面临的问题 我们知道传统的web server,一个进程打开socket,监听,来了请求生成新的进程(或线程.或 ...

  4. 有关彩票的python编程教程_python实现彩票系统

    本文为大家分享了python实现彩票系统的具体代码,供大家参考,具体内容如下 功能:1.注册  2.登录  3.充钱   4.提现  5.下注  6.开奖  7.退出 简述:彩民需要用身份证号码开户注 ...

  5. python中如何写windows系统路径_Python在windows系统中表示文件路径

    Windows系统中,路径使用的是\.而Linux系统中,路径使用/.\同时也是转义字符,所以使用\的时候会有问题. 如果运气好,\后没有可以转义的字符,还是可以正常输出:print("C: ...

  6. 一个python停车管理系统_python简易停车系统

    # 简易版停车管理: # # 停车场最多停车数; max_car; # 当前停车数;cur_car; # 当前停车列表; car_list = [] # # 停车: # 1). 如果没有达到最多停车数 ...

  7. python点餐系统早餐_python 点餐系统(仅函数实现)

    # 主界面 import random import time k = 1 flag = False price = 0 vip_list = [] order_list = [] dish_list ...

  8. python 多级递归_Python文件目录和系统操作,os模块和os.path模块

    os模块 # 输出平台名称,windows是"nt",Unix是"posix". 1. os.name # 路径分隔符,如windows的'',linux的'/ ...

  9. python选课系统代码_python模拟选课系统

    要求: 角色:学校.学员.课程.讲师 要求: 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 3. 课程 ...

最新文章

  1. MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk.
  2. boost::contract模块实现equal的测试程序
  3. sql语句练习(二):Demand
  4. [react] ES6的语法‘...‘在React中有哪些应用?
  5. LeetCode 825. 适龄的朋友(计数排序+前缀和)
  6. 【逆强化学习-2】最大熵学习(Maximum Entropy Learning)
  7. jstl core and jstl fn
  8. 【Sublime Text 3】Sublime Text 3 - cracked 3092
  9. SAP License:ERP企业资源计划
  10. 【狂神说Redis】1NoSQL概述 1-1为什么使用NoSQL
  11. 【用jersey构建REST服务】系列文章
  12. 一看就懂:正则表达式
  13. 使用c#制作赛尔号登录器
  14. html多个span平均分布各行,往div里面加100个span 每10个换行 换行怎么换啊
  15. Python语言程序设计——实验五
  16. 李春华:B2C商城做SEO的九个常见目标定位
  17. 变现 起航篇! 手把手交你用chatgpt快速生成视频!
  18. 西门菲莎大学计算机专业排名,2019-2020西门菲莎大学世界排名多少【QS最新第314名】...
  19. P问题、NP问题、NP完全问题和NP-hard问题
  20. 连接远程计算机提示:“这可能是由于CredSSP加密数据库修正” 问题

热门文章

  1. Python datetime __str __()方法与示例
  2. Python operator.truth()函数与示例
  3. 一文掌握Redisson分布式锁原理|干货推荐
  4. 为什么建议你使用枚举?
  5. ubuntu搭建nodejs生产环境——快速部署手册
  6. ORACLE SQL获取时间字段
  7. 全志A20 刷入Ubuntu/Debian Linux固件 亲测能用
  8. python RSA加密、解密、签名
  9. nifi 实现数据库到数据库之间数据同步
  10. 部署虚拟环境安装Linux系统(Linux就该这么学)笔记