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 相关文章推荐
本地文件上传到七牛云服务器示例(七牛云存储)
Jan 11 Python
python协程用法实例分析
Jun 04 Python
Mac 上切换Python多版本
Jun 17 Python
Python 一句话生成字母表的方法
Jan 02 Python
python自定义时钟类、定时任务类
Feb 22 Python
python切片(获取一个子列表(数组))详解
Aug 09 Python
用sqlalchemy构建Django连接池的实例
Aug 29 Python
opencv3/C++实现视频背景去除建模(BSM)
Dec 11 Python
Python面向对象原理与基础语法详解
Jan 02 Python
完美解决keras 读取多个hdf5文件进行训练的问题
Jul 01 Python
python中id函数运行方式
Jul 03 Python
Python中全局变量和局部变量的理解与区别
Feb 07 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
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
2013/07/03 PHP
php mail to 配置详解
2014/01/16 PHP
php数组编码转换示例详解
2014/03/11 PHP
PHP中字符安全过滤函数使用小结
2015/02/25 PHP
PHP添加图片水印、压缩、剪切的封装类
2015/08/17 PHP
PHP实现小程序批量通知推送
2018/11/27 PHP
IE php关于强制下载文件的代码
2008/08/23 Javascript
JS 两日期相减,获得天数的小例子(兼容IE,FF)
2013/07/01 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
2014/01/14 Javascript
js/jquery获取文本框输入焦点的方法
2014/03/04 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
JS时间特效最常用的三款
2015/08/19 Javascript
javascript实现的登陆遮罩效果汇总
2015/11/09 Javascript
node.js+express制作网页计算器
2016/01/17 Javascript
基于js实现的限制文本框只可以输入数字
2016/12/05 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
BootStrap Select清除选中的状态恢复默认状态
2017/06/20 Javascript
微信小程序上传图片实例
2018/05/28 Javascript
js使用Promise实现简单的Ajax缓存
2018/11/14 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
2020/07/26 Javascript
Vue实现点击导航栏当前标签后变色功能
2020/08/19 Javascript
[16:19]教你分分钟做大人——风暴之灵
2015/03/11 DOTA
[48:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第二场 1月29日
2021/03/11 DOTA
pandas.DataFrame选取/排除特定行的方法
2018/07/03 Python
带你认识HTML5中的WebSocket
2015/05/22 HTML / CSS
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
Vita Fede官网:在意大利手工制作,在纽约市设计
2019/10/25 全球购物
石油工程专业毕业生求职信
2014/04/13 职场文书
大二学生自我检讨书
2014/10/23 职场文书
预备党员群众路线教育实践活动思想汇报2014
2014/10/25 职场文书
教导主任个人总结
2015/03/03 职场文书
pandas中对文本类型数据的处理小结
2021/11/01 Python
python​格式化字符串
2022/04/20 Python