浅谈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 相关文章推荐
简单介绍Python中的JSON使用
Apr 28 Python
在Python中处理字符串之ljust()方法的使用简介
May 19 Python
在Python中处理字符串之isdecimal()方法的使用
May 20 Python
编写Python小程序来统计测试脚本的关键字
Mar 12 Python
python+opencv轮廓检测代码解析
Jan 05 Python
python使用matplotlib库生成随机漫步图
Aug 27 Python
Django objects的查询结果转化为json的三种方式的方法
Nov 07 Python
python3通过selenium爬虫获取到dj商品的实例代码
Apr 25 Python
Python实现的栈、队列、文件目录遍历操作示例
May 06 Python
Python操作redis实例小结【String、Hash、List、Set等】
May 16 Python
Pygame框架实现飞机大战
Aug 07 Python
Python如何使用ElementTree解析xml
Oct 12 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
php中get_meta_tags()、CURL与user-agent用法分析
2014/12/16 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
javascript FormatNumber函数实现方法
2008/12/30 Javascript
$.format,jquery.format 使用说明
2011/07/13 Javascript
JavaScript创建一个欢迎cookie弹出窗实现代码
2013/03/15 Javascript
jQuery实现鼠标经过图片预览大图效果
2014/04/10 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
JS取数字小数点后两位或n位的简单方法
2016/10/24 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
2017/03/30 Javascript
Vue响应式原理详解
2017/04/18 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
python 输出一个两行字符的变量
2009/02/05 Python
python读写ini文件示例(python读写文件)
2014/03/25 Python
Python实现的多线程http压力测试代码
2017/02/08 Python
python 连接sqlite及简单操作
2017/06/30 Python
python使用opencv读取图片的实例
2017/08/17 Python
Python递归函数 二分查找算法实现解析
2019/08/12 Python
flask 实现token机制的示例代码
2019/11/07 Python
pytorch的batch normalize使用详解
2020/01/15 Python
python3安装OCR识别库tesserocr过程图解
2020/04/02 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
大唐面试试题(CPU,UNIX等等)
2012/01/11 面试题
机电一体化专业应届生求职信
2013/11/27 职场文书
食品安全责任书
2014/04/15 职场文书
2014年变电站工作总结
2014/12/19 职场文书
泰山导游词
2015/02/02 职场文书
客户付款通知书
2015/04/23 职场文书
小学生勤俭节约倡议书
2015/04/29 职场文书
不同意离婚答辩状
2015/05/22 职场文书
golang中切片copy复制和等号复制的区别介绍
2021/04/27 Golang
你真的了解redis为什么要提供pipeline功能
2021/06/22 Redis