浅谈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中字典映射类型的学习教程
Aug 20 Python
使用Python编写爬虫的基本模块及框架使用指南
Jan 20 Python
深入浅析python定时杀进程
Jun 06 Python
Python图像处理之颜色的定义与使用分析
Jan 03 Python
Python csv模块使用方法代码实例
Aug 29 Python
python lambda表达式(匿名函数)写法解析
Sep 16 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
Oct 24 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
Feb 07 Python
pytorch ImageFolder的覆写实例
Feb 20 Python
appium+python adb常用命令分享
Mar 06 Python
Python -m参数原理及使用方法解析
Aug 21 Python
基于python制作简易版学生信息管理系统
Apr 20 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数组函数序列之array_splice() - 在数组任意位置插入元素
2011/11/07 PHP
php中mt_rand()随机数函数用法
2014/11/24 PHP
Codeigniter检测表单post数据的方法
2015/03/21 PHP
PHP+MySQL之Insert Into数据插入用法分析
2015/09/27 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
javascript 获取图片颜色
2009/04/05 Javascript
JQuery中$.ajax()方法参数详解及应用
2013/12/12 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
2014/02/26 Javascript
js实现div弹出层的方法
2014/11/20 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
JavaScript实现弹出模态窗体并接受传值的方法
2016/02/12 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
2017/04/04 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
nodejs超出最大的调用栈错误问题
2017/12/27 NodeJs
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
解决vue的变量在settimeout内部效果失效的问题
2018/08/30 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
Python实现周期性抓取网页内容的方法
2015/11/04 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
利用python获取Ping结果示例代码
2017/07/06 Python
浅谈numpy数组的几种排序方式
2017/12/15 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
Python常见字典内建函数用法示例
2018/05/14 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
详细介绍pandas的DataFrame的append方法使用
2019/07/31 Python
Django restframework 框架认证、权限、限流用法示例
2019/12/21 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
基于python tkinter的点名小程序功能的实例代码
2020/08/22 Python
德国家具购物网站:Möbel Höffner
2019/08/26 全球购物
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
自荐信写法介绍
2014/01/25 职场文书
联谊会主持词
2014/03/26 职场文书
党风廉政建设责任书
2014/04/14 职场文书
机器人瓦力观后感
2015/06/12 职场文书
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS