浅谈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的Scrapy框架十分钟爬取美女图
Dec 26 Python
Python实现的文本简单可逆加密算法示例
May 18 Python
python中使用正则表达式的连接符示例代码
Oct 10 Python
django 自定义过滤器的实现
Feb 26 Python
详解Python用户登录接口的方法
Apr 17 Python
django 通过URL访问上传的文件方法
Jul 28 Python
详解Python实现进度条的4种方式
Jan 15 Python
浅谈python中频繁的print到底能浪费多长时间
Feb 21 Python
关于Python Tkinter Button控件command传参问题的解决方式
Mar 04 Python
如何理解python中数字列表
May 29 Python
理解Django 中Call Stack机制的小Demo
Sep 01 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
Dec 03 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 mail 通过Windows的SMTP发送邮件失败的解决方案
2009/05/27 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
2013/06/13 PHP
php中使用getimagesize获取图片、flash等文件的尺寸信息实例
2014/04/29 PHP
php中get_defined_constants函数用法实例分析
2015/05/12 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
教您去掉ie网页加载进度条的方法
2010/12/09 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
AngularJS基础 ng-if 指令用法
2016/08/01 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
2017/01/04 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
Vue结合SignalR实现前后端实时消息同步
2017/09/19 Javascript
Vuejs监听vuex中值的变化的方法示例
2018/12/02 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
2019/05/29 Javascript
Vue+Vuex实现自动登录的知识点详解
2020/03/04 Javascript
JS+CSS实现3D切割轮播图
2020/03/21 Javascript
小程序Scroll-view上拉滚动刷新数据
2020/06/21 Javascript
vue v-model的用法解析
2020/10/19 Javascript
[01:02:54]完美世界DOTA2联赛PWL S2 FTD vs GXR 第一场 11.22
2020/11/26 DOTA
python实现socket客户端和服务端简单示例
2014/02/24 Python
python生成随机验证码(中文验证码)示例
2014/04/03 Python
python错误处理详解
2014/09/28 Python
Mac 上切换Python多版本
2017/06/17 Python
python使用多线程编写tcp客户端程序
2019/09/02 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
python程序文件扩展名知识点详解
2020/02/27 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
美国知名的摄影器材销售网站:Adorama
2017/02/01 全球购物
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
JAVA中的关键字有什么特点
2014/03/07 面试题
教师党员个人自我剖析材料
2014/09/29 职场文书
房屋过户委托书范本
2014/10/07 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书
Django项目如何正确配置日志(logging)
2021/04/29 Python
解析原生JS getComputedStyle
2021/05/25 Javascript
MySQL通过binlog恢复数据
2021/05/27 MySQL