浅谈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 相关文章推荐
Tornado服务器中绑定域名、虚拟主机的方法
Aug 22 Python
Python数组定义方法
Apr 13 Python
wxpython中Textctrl回车事件无效的解决方法
Jul 21 Python
python爬虫入门教程--正则表达式完全指南(五)
May 25 Python
浅谈python中的__init__、__new__和__call__方法
Jul 18 Python
python之Character string(实例讲解)
Sep 25 Python
python MysqlDb模块安装及其使用详解
Feb 23 Python
Sanic框架流式传输操作示例
Jul 18 Python
python 产生token及token验证的方法
Dec 26 Python
python列表插入append(), extend(), insert()用法详解
Sep 14 Python
python保留小数位的三种实现方法
Jan 07 Python
深入分析python 排序
Aug 24 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+HTML+JavaScript+Css实现简单爬虫开发
2016/03/28 PHP
[原创]php简单隔行变色功能实现代码
2016/07/09 PHP
PHP+JQUERY操作JSON实例
2017/03/23 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
2017/10/25 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
Laravel中的chunk组块结果集处理与注意问题
2018/08/15 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
jQuery 改变CSS样式基础代码
2010/02/11 Javascript
javascript 文章截取部分无损html显示实现代码
2010/05/04 Javascript
Extjs优化(二)Form表单提交通用实现
2013/04/15 Javascript
把jquery 的dialog和ztree结合实现步骤
2013/08/02 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
javascript如何实现360度全景照片问题汇总
2016/04/04 Javascript
全面接触神奇的Bootstrap导航条实战篇
2016/08/01 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
Vue2组件tree实现无限级树形菜单
2017/03/29 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
在vue中读取本地Json文件的方法
2018/09/06 Javascript
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
js和jquery判断数据类型的4种方法总结
2020/08/28 jQuery
python基础教程之分支、循环简单用法
2016/06/16 Python
python 列表,数组,矩阵两两转换tolist()的实例
2018/04/04 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
python 实现两个线程交替执行
2020/05/02 Python
利用CSS3实现进度条的两种姿势详解
2017/03/21 HTML / CSS
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
请说出几个常用的异常类
2013/01/08 面试题
Jar包的作用是什么
2014/03/30 面试题
简历中个人自我评价范文
2013/12/26 职场文书
年度安全生产目标责任书
2014/07/23 职场文书
竞聘报告优秀范文
2014/11/06 职场文书
质量保证书格式模板
2015/02/27 职场文书
小学体育教学随笔
2015/08/14 职场文书