浅谈python多线程和队列管理shell程序


Posted in Python onAugust 04, 2015

首先来描述下环境,在机器上有很多个JAVA程序,我们在每个JAVA程序里都配置了一个启动|停止|重启的脚本

举个例子:

我们现在要同时运行这些脚本,来达到快速启动所有的JAVA程序,如果我们只用多线程的话,线程是不会返回消息给父进程,我们如何才能知道这些程序是启动成功了呢?

所以我们用到了队列来管理。

"""我试过gevent,但是会在command这里造成阻塞"""

gevent代码如下  如果有朋友知道如何优化,请您告诉我

#!/usr/bin/python2.7
# -*- coding:utf-8 -*-
import os,sys
from datetime import datetime
import commands
import gevent.monkey
gevent.monkey.patch_os()
import gevent
 
def Servers():
  servers=commands.getoutput('''ls /data/program/payment/ | grep 'payment' ''')
  servers=servers.split('\n')
  return servers
 
def handle(servername):
  if sys.argv[1] == 'start' or sys.argv[1] == 'stop' or sys.argv[1] == 'restart':
    print '\033[1;31;40m'
    print '========================>>>go to handle %s<<<=========================' %servername
    print '\033[0m'
    r=commands.getoutput('''su - tomcat -c "/data/program/payment/%s/bin/server.sh %s &" ''' %(servername,sys.argv[1]))  #在这里会阻塞,我们无法找到合适的地方进行协程的切换
    gevent.sleep(0)        #无论放到何处,不是之前就是切换之后都会阻塞。
    print r
  else:
    print 'Please Use start | stop | restart To Handle The Command'
    sys.exit(1)
   
if __name__ == '__main__':
  s=Servers()
  threads=[]
  for i in s:
    threads.append(gevent.spawn(handle,i))
#  print threads
  gevent.joinall(threads)

多线程代码如下

#!/usr/bin/python2.7
# -*- coding:utf-8 -*-
 
from datetime import datetime
import commands
from Queue import Queue
from threading import Thread
 
_sentinel = object()
 
def Servers():
  servers=commands.getoutput('''ls /data/program/payment/ | grep 'payment' ''')
  servers=servers.split('\n')
  return servers
 
def producer(servername,out_q):
  if sys.argv[1] == 'start' or sys.argv[1] == 'stop' or sys.argv[1] == 'restart':
    print '\033[1;31;40m'
    print '========================>>>put %s in Queue<<<=========================' %servername
    print '\033[0m'
    out_q.put_nowait(commands.getoutput('''su - tomcat -c "/data/program/payment/%s/bin/server.sh %s &" ''' %(servername,sys.argv[1])))  #放入队列的对象
     
  else:
    print 'Please Use start | stop | restart To Handle The Command'
    sys.exit(1)
 
def consumer(servername,in_q):
  n=len(servername)
  while n > 0:             #循环在队列中取结果,直到循环结束
    data=in_q.get()
    n -= 1
    print '\033[1;31;40m'
    print data
    print '\033[0m'
  print '\033[1;31;40m'
  print 'consumer was done!!!!!!!'
  print '\033[0m' 
 
if __name__ == '__main__':
  s=Servers()
  q = Queue()
  t1 = Thread(target=consumer, args=(s,q,))      #消费者在队列中获取结果,前面的函数内部已经循环获取
  for i in s:
    t2=Thread(target=producer, args=(i,q,))     #讲线程进行管理,放入队列
    t2.start()                   #启动生产者线程
#    t2.join()                   #启动生产者以后放弃校验线程是否结束,进行并发,因为我们是把线程放入队列进行管理的,所以不用在这里等待线程结束,如果使用了join这里会阻塞我们的程序。线程结束后,消费者会通知父进程线程已经结束。
  t1.start()                     #启动消费者线程
  t1.join()                      #在获取完成之前进行线程的阻塞

简单的说下join这个方法:

调用Thread.join将会使主调线程堵塞,直到被调用线程运行结束或超时。参数timeout是一个数值类型,表示超时时间,如果未提供该参数,那么主调线程将一直堵塞到被调线程结束。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Python 相关文章推荐
浅谈flask截获所有访问及before/after_request修饰器
Jan 18 Python
Python堆排序原理与实现方法详解
May 11 Python
spark: RDD与DataFrame之间的相互转换方法
Jun 07 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
Oct 30 Python
对python修改xml文件的节点值方法详解
Dec 24 Python
Python 从列表中取值和取索引的方法
Dec 25 Python
python循环输出三角形图案的例子
Nov 22 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 Python
在echarts中图例legend和坐标系grid实现左右布局实例
May 16 Python
python 下划线的不同用法
Oct 24 Python
神经网络训练采用gpu设置的方式
Mar 03 Python
Python万能模板案例之matplotlib绘制甘特图
Apr 13 Python
python中使用序列的方法
Aug 03 #Python
python实现备份目录的方法
Aug 03 #Python
python使用MySQLdb访问mysql数据库的方法
Aug 03 #Python
浅谈Python中列表生成式和生成器的区别
Aug 03 #Python
详解Python3中的Sequence type的使用
Aug 01 #Python
将Python代码嵌入C++程序进行编写的实例
Jul 31 #Python
Python制作数据导入导出工具
Jul 31 #Python
You might like
做个自己站内搜索引擎
2006/10/09 PHP
PHP 中的面向对象编程:通向大型 PHP 工程的办法
2006/12/03 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
CI框架中集成CKEditor编辑器的教程
2014/06/09 PHP
discuz目录文件资料汇总
2014/12/30 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
2015/12/17 PHP
JavaScript高级程序设计 事件学习笔记
2011/09/10 Javascript
JQuery调用WebServices的方法和4个实例
2014/05/06 Javascript
JavaScript中的document.referrer在各种浏览器测试结果
2014/07/18 Javascript
javascript创建动态表单的方法
2015/07/25 Javascript
Bootstrap carousel轮转图的使用实例详解
2016/05/17 Javascript
jquery取消事件冒泡的三种方法(推荐)
2016/05/28 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
Bootstrap响应式侧边栏改进版
2016/09/17 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
vue实现整屏滚动切换
2020/06/29 Javascript
Python 深入理解yield
2008/09/06 Python
Python查看多台服务器进程的脚本分享
2014/06/11 Python
python 写入csv乱码问题解决方法
2016/10/23 Python
聊聊Python中的pypy
2018/01/12 Python
Python实现购物车程序
2018/04/16 Python
Pyspark获取并处理RDD数据代码实例
2020/03/27 Python
Python图片处理模块PIL操作方法(pillow)
2020/04/07 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
2020/07/03 Python
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
2014/09/09 面试题
实习心得体会
2014/01/02 职场文书
庆七一活动方案
2014/01/25 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
医生党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年学校体育工作总结
2014/12/08 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
三八妇女节慰问信
2015/02/14 职场文书
2015年政风行风工作总结
2015/04/21 职场文书
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android