python 系统架构_Python之优化系统架构的方案
方案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之优化系统架构的方案相关推荐
- python安装系统要求_python需要什么系统 | window重装系统教程
python的spyder怎么打开,或者具体的安装教程 1.spyder 打https://pypi.python.org/pypi/spyder 下载里面最新的源码zip包,在解压后,cmd里cd到 ...
- python用户登录_python用户登录系统
本文实例为大家分享了用户登录系统python实现代码,供大家参考,具体内容如下 注意事项: 1.使用python3执行程序.按提示输入1或2,登录或退出程序 2.输入用户名后,如果用户名被锁定及无效用 ...
- python前端用什么架构_Python web世界观——web架构概览(适合传统软件工程师)...
Python web世界观--web架构概览(适合传统程序员) 传统web server面临的问题 我们知道传统的web server,一个进程打开socket,监听,来了请求生成新的进程(或线程.或 ...
- 有关彩票的python编程教程_python实现彩票系统
本文为大家分享了python实现彩票系统的具体代码,供大家参考,具体内容如下 功能:1.注册 2.登录 3.充钱 4.提现 5.下注 6.开奖 7.退出 简述:彩民需要用身份证号码开户注 ...
- python中如何写windows系统路径_Python在windows系统中表示文件路径
Windows系统中,路径使用的是\.而Linux系统中,路径使用/.\同时也是转义字符,所以使用\的时候会有问题. 如果运气好,\后没有可以转义的字符,还是可以正常输出:print("C: ...
- 一个python停车管理系统_python简易停车系统
# 简易版停车管理: # # 停车场最多停车数; max_car; # 当前停车数;cur_car; # 当前停车列表; car_list = [] # # 停车: # 1). 如果没有达到最多停车数 ...
- python点餐系统早餐_python 点餐系统(仅函数实现)
# 主界面 import random import time k = 1 flag = False price = 0 vip_list = [] order_list = [] dish_list ...
- python 多级递归_Python文件目录和系统操作,os模块和os.path模块
os模块 # 输出平台名称,windows是"nt",Unix是"posix". 1. os.name # 路径分隔符,如windows的'',linux的'/ ...
- python选课系统代码_python模拟选课系统
要求: 角色:学校.学员.课程.讲师 要求: 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 3. 课程 ...
最新文章
- MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk.
- boost::contract模块实现equal的测试程序
- sql语句练习(二):Demand
- [react] ES6的语法‘...‘在React中有哪些应用?
- LeetCode 825. 适龄的朋友(计数排序+前缀和)
- 【逆强化学习-2】最大熵学习(Maximum Entropy Learning)
- jstl core and jstl fn
- 【Sublime Text 3】Sublime Text 3 - cracked 3092
- SAP License:ERP企业资源计划
- 【狂神说Redis】1NoSQL概述 1-1为什么使用NoSQL
- 【用jersey构建REST服务】系列文章
- 一看就懂:正则表达式
- 使用c#制作赛尔号登录器
- html多个span平均分布各行,往div里面加100个span 每10个换行 换行怎么换啊
- Python语言程序设计——实验五
- 李春华:B2C商城做SEO的九个常见目标定位
- 变现 起航篇! 手把手交你用chatgpt快速生成视频!
- 西门菲莎大学计算机专业排名,2019-2020西门菲莎大学世界排名多少【QS最新第314名】...
- P问题、NP问题、NP完全问题和NP-hard问题
- 连接远程计算机提示:“这可能是由于CredSSP加密数据库修正” 问题