浅谈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的Django框架中创建模板库的方法
Jul 20 Python
python的mysqldb安装步骤详解
Aug 14 Python
基于Python 装饰器装饰类中的方法实例
Apr 21 Python
Python日志无延迟实时写入的示例
Jul 11 Python
将Python文件打包成.EXE可执行文件的方法
Aug 11 Python
解决python使用list()时总是报错的问题
May 05 Python
Pygame的程序开始示例代码
May 07 Python
Python函数必须先定义,后调用说明(函数调用函数例外)
Jun 02 Python
Python爬虫入门有哪些基础知识点
Jun 02 Python
Python 使用 PyQt5 开发的关机小工具分享
Jul 16 Python
总结几个非常实用的Python库
Jun 26 Python
使用Python开发贪吃蛇游戏 SnakeGame
Apr 30 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
codeigniter发送邮件并打印调试信息的方法
2015/03/21 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
2016/12/14 PHP
yii2利用自带UploadedFile实现上传图片的示例
2017/02/16 PHP
PHP autoload使用方法及步骤详解
2020/09/05 PHP
javascript jQuery插件练习
2008/12/24 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
简单谈谈json跨域
2016/03/13 Javascript
浅析JS获取url中的参数实例代码
2016/06/14 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
AngularJS equal比较对象实例详解
2016/09/14 Javascript
JS扩展类,克隆对象与混合类实例分析
2016/11/26 Javascript
详解Nodejs的timers模块
2016/12/22 NodeJs
AngularJS service之select下拉菜单效果
2017/07/28 Javascript
详解React Native 屏幕适配(炒鸡简单的方法)
2018/06/11 Javascript
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
JavaScript代码调试方法实例小结
2019/01/05 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
[28:05]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第一场 10月30日
2020/10/31 DOTA
Python实现微信公众平台自定义菜单实例
2015/03/20 Python
举例讲解Python中的身份运算符的使用方法
2015/10/13 Python
python3实现二叉树的遍历与递归算法解析(小结)
2019/07/03 Python
keras的siamese(孪生网络)实现案例
2020/06/12 Python
HTML5 层的叠加的实现
2020/07/07 HTML / CSS
文员个人求职自荐信
2013/09/21 职场文书
中专自荐信
2013/10/13 职场文书
计算机专业毕业生求职信分享
2013/12/24 职场文书
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
电大会计学自我鉴定
2014/02/06 职场文书
大学生个人求职口试自我评价
2014/02/16 职场文书
心理健康活动总结
2014/04/30 职场文书
国旗下的讲话演讲稿
2014/05/08 职场文书
2014年教师政治学习材料
2014/06/02 职场文书
艺术设计专业毕业生推荐信
2014/07/08 职场文书
2016自主招生校长推荐信范文
2015/03/23 职场文书
如何设计高效合理的MySQL查询语句
2021/05/26 MySQL