浅谈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对象体系深入分析
Oct 28 Python
Python实现遍历windows所有窗口并输出窗口标题的方法
Mar 13 Python
初探TensorFLow从文件读取图片的四种方式
Feb 06 Python
TensorFlow实现Batch Normalization
Mar 08 Python
Django使用Mysql数据库已经存在的数据表方法
May 27 Python
Python 获取div标签中的文字实例
Dec 20 Python
python游戏地图最短路径求解
Jan 16 Python
python数据挖掘需要学的内容
Jun 23 Python
Django的models模型的具体使用
Jul 15 Python
Python如何定义有默认参数的函数
Aug 10 Python
Django xadmin安装及使用详解
Oct 26 Python
vue.js刷新当前页面的实例讲解
Dec 29 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
世界咖啡生产者论坛呼吁:需要立即就咖啡价格采取认真行动
2021/03/06 咖啡文化
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
深入浅析PHP无限极分类的案例教程
2016/05/09 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
不想让浏览器运行javascript脚本的方法
2015/11/20 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
Bootstarp风格的toggle效果分享
2016/02/23 Javascript
JavaScript继承学习笔记【新手必看】
2016/05/10 Javascript
获取JS中网页各种高宽与位置的方法总结
2016/07/27 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
基于JS实现仿京东搜索栏随滑动透明度渐变效果
2017/07/10 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
jquery实现简单自动轮播图效果
2020/07/29 jQuery
基于进程内通讯的python聊天室实现方法
2015/06/28 Python
使用Django的模版来配合字符串翻译工作
2015/07/27 Python
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
2017/03/19 Python
Python批量安装卸载1000个apk的方法
2020/04/10 Python
HTML5中微数据概述及在搜索引擎中的使用举例
2013/02/07 HTML / CSS
C/C++有关内存的思考题
2015/12/04 面试题
sort命令的作用和用法
2013/08/25 面试题
学校消防安全制度
2014/01/30 职场文书
运动会稿件50字
2014/02/17 职场文书
庆元旦迎新年广播稿
2014/02/18 职场文书
心理咨询专业自荐信
2014/07/07 职场文书
小学运动会演讲稿
2014/08/25 职场文书
乡镇群众路线专项整治方案
2014/11/03 职场文书
2015年话务员工作总结
2015/04/29 职场文书
工作会议简报
2015/07/20 职场文书
新人入职感言
2015/07/31 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
小学语文国培研修日志
2015/11/13 职场文书
2019个人工作态度自我评价
2019/04/24 职场文书
Java 数据结构七大排序使用分析
2022/04/02 Java/Android