Python实现的多进程和多线程功能示例


Posted in Python onMay 29, 2018

本文实例讲述了Python实现的多进程和多线程功能。分享给大家供大家参考,具体如下:

听了朋友说起,他们目前开发的测试框架,用python实现的分布式系统。虽然python的执行效率没有c和c++那么高,但是依靠集群的力量,产生的压力很是牛逼啊。

了解了下大概的方式就是

1、有台主控机,负责调度,比如执行的参数等

2、有n多台执行机,每个执行机上部署一个python的xmlRPC server,主控机调用rpccall,然后执行机执行。rpccall里面会fork一些进程,每个进程再创建一些线程,去调用测试方法。这样,扩展性就很好了。

对于python的rpc call,之前也没有接触过,不是很了解,google了一下,发现很简单,拿了个网上的例子,如下,先部署一个rpcServer

from SimpleXMLRPCServer import SimpleXMLRPCServer
def add(a , b): 
  return a+bserver = SimpleXMLRPCServer(("10.249.192.38", 8000))#这里不要用localhost,否则只有本机才能访问
server.register_function(add)
server.serve_forever()

客户端:

from xmlrpclib import Server
Proxyserver = ServerProxy("http://localhost:8000")
try: ret = server.add(30,90) print 'result:', ret print 'result type:', type(ret)
except
 Exception, e: print "exception",e

其实还是很简单的。

然后再看了下python的多进程和多线程的方法,写了个例子,如下:

#encoding=utf-8
import sys
import os
import time
import pdb
import httplib
import thread
import threading
constant_p = 0 #创建全局变量,进程数
constant_s = 0 #创建全局变量,线程数
mutex_g = threading.RLock() #创建全局锁
def run(count):#该函数创建3个线程,同时调用3个不同的函数
  a = 1
  b = 0
  thread.start_new_thread(test0,(a,b))#这里传入的参数需要以元组的形式,跟void指针其实也差不多
  thread.start_new_thread(test1,(a,b))
  thread.start_new_thread(test2,(a,b))
def test0(a,b):
  global mutex_g
  global constant_s
  threadid = thread.get_ident()
  mutex_g.acquire()#这里需要把线程数说锁起来,否则结果会被修改
  constant_s = constant_s+1
  mutex_g.release()
  print "thread 0 called,and the threadid is:%d"%(threadid)
  sys.exit(0)
def test1(a,b):
  global mutex_g
  global constant_s
  threadid = thread.get_ident()
  mutex_g.acquire()
  constant_s = constant_s+1
  mutex_g.release()
  print "thread 1 called,and the threadid is:%d"%(threadid)
  sys.exit(0)
def test2(a,b):
  global mutex_g
  global constant_s
  threadid = thread.get_ident()
  mutex_g.acquire()
  constant_s = constant_s+1
  mutex_g.release()
  print "thread 2 called,and the threadid is:%d"%(threadid)
  sys.exit(0)
def my_fork():
  global constant_p
  pid = os.fork()#fork一个子进程,子进程的pid=0同时2个进程会执行my_fork()函数
  if (pid == 0):#子进程执行到这个if里面
    constant_p = constant_s + 1
    run(3)
    time.sleep(5)
    print "total thread is %d"%constant_s#这个结果是3,因为子进程创建按了3个线程
  elif (pid >0):#父进程执行到这个if里面
    constant_p = constant_s + 1 run(4)
    time.sleep(5)
    print "total thread is %d"%constant_s#这个结果也是3,因为该进程也创建了3个线程
  else:
    print "fork error"
    sys.exit(0)
  print "total process is %d"%constant_p#该结果是1,因为2个进程只执行了一次
  constant_p = constant_s + 1
  sys.exit(0)
if __name__ == "__main__":
  my_fork()
  #my_fork()
  #my_fork()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python网络编程学习笔记(三):socket网络服务器
Jun 09 Python
Python的高级Git库 Gittle
Sep 22 Python
详解Python程序与服务器连接的WSGI接口
Apr 29 Python
python编写简单爬虫资料汇总
Mar 22 Python
详解python如何调用C/C++底层库与互相传值
Aug 10 Python
Pandas GroupBy对象 索引与迭代方法
Nov 16 Python
python多线程同步之文件读写控制
Feb 25 Python
使用matlab或python将txt文件转为excel表格
Nov 01 Python
在PyCharm中实现添加快捷模块
Feb 12 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
Jun 08 Python
python-地图可视化组件folium的操作
Dec 14 Python
细说NumPy数组的四种乘法的使用
Dec 18 Python
Python实现的redis分布式锁功能示例
May 29 #Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
May 29 #Python
PyTorch CNN实战之MNIST手写数字识别示例
May 29 #Python
Python根据指定日期计算后n天,前n天是哪一天的方法
May 29 #Python
python 将md5转为16字节的方法
May 29 #Python
python 利用栈和队列模拟递归的过程
May 29 #Python
查看django执行的sql语句及消耗时间的两种方法
May 29 #Python
You might like
使用Linux五年积累的一些经验技巧
2013/06/20 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
php定界符
2014/06/19 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
PHP中Laravel 关联查询返回错误id的解决方法
2017/04/01 PHP
PHP写的简单数字验证码实例
2017/05/23 PHP
JavaScript中的作用域链和闭包
2012/06/30 Javascript
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
jquery实现页面图片等比例放大缩小功能
2014/02/12 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
2016/09/14 Javascript
浅谈jquery高级方法描述与应用
2016/10/04 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
2016/11/02 Javascript
vue-resource 拦截器使用详解
2017/02/21 Javascript
详解Vue 动态添加模板的几种方法
2017/04/25 Javascript
JavaScript与Java正则表达式写法的区别介绍
2017/08/15 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
2018/09/27 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
2019/04/15 Javascript
OpenLayers3实现对地图的基本操作
2020/09/28 Javascript
python中的多重继承实例讲解
2014/09/28 Python
Python安装官方whl包和tar.gz包的方法(推荐)
2017/06/04 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
2018/06/05 Python
Python实现插入排序和选择排序的方法
2019/05/12 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
利用简洁的图片预加载组件提升html5移动页面的用户体验
2016/03/11 HTML / CSS
澳大利亚优质葡萄酒专家:Vintage Cellars
2019/01/08 全球购物
linux面试题参考答案(3)
2012/09/13 面试题
网络工程师个人的自我评价范文
2013/10/01 职场文书
飞机制造技术专业求职信
2014/07/27 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书
利用Pycharm连接服务器的全过程记录
2021/07/01 Python