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 容器总结整理
Apr 04 Python
python安装numpy&安装matplotlib& scipy的教程
Nov 02 Python
python使用openpyxl库修改excel表格数据方法
May 03 Python
Django实现登录随机验证码的示例代码
Jun 20 Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 Python
python进阶之自定义可迭代的类
Aug 20 Python
django 简单实现登录验证给你
Nov 06 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
Nov 15 Python
python如何通过twisted搭建socket服务
Feb 03 Python
Python如何把Spark数据写入ElasticSearch
Apr 18 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
Jun 18 Python
Python爬虫教程之利用正则表达式匹配网页内容
Dec 08 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高级OOP技术演示
2009/08/27 PHP
PHP+Mysql+jQuery实现动态展示信息
2011/10/08 PHP
强烈声明: 不要使用(include/require)_once
2013/06/06 PHP
PHP设计模式之迭代器模式的深入解析
2013/06/13 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
表单内同名元素的控制
2006/11/22 Javascript
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
javascript 二分法(数组array)
2010/04/24 Javascript
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
关于javascript中的typeof和instanceof介绍
2012/12/04 Javascript
js显示时间 js显示最后修改时间
2013/01/02 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
如何实现移动端浏览器不显示 pc 端的广告
2015/10/15 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
BootStrop前端框架入门教程详解
2016/12/25 Javascript
jquery代码规范让代码越来越好看
2017/02/03 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
VUE解决 v-html不能触发点击事件的问题
2019/10/28 Javascript
如何解决vue在ios微信"复制链接"功能问题
2020/03/26 Javascript
小程序选项卡以及swiper套用(跨页面)
2020/06/19 Javascript
[44:40]Serenity vs Pain 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python自动连接ssh的方法
2015/03/07 Python
python数字图像处理之高级形态学处理
2018/04/27 Python
解决python 自动安装缺少模块的问题
2018/10/22 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
2020/12/14 Python
解决Python import .pyd 可能遇到路径的问题
2021/03/04 Python
CSS3实现酷炫的3D旋转透视效果
2019/11/21 HTML / CSS
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
实习期自我鉴定
2013/10/11 职场文书
DIY蛋糕店的创业计划书范文
2013/12/26 职场文书
收银出纳员岗位职责
2014/02/23 职场文书
蓝颜请假条
2014/04/11 职场文书
2014幼儿园中班工作总结
2014/11/10 职场文书
消防宣传语大全
2015/07/13 职场文书