浅谈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框架中prefetch_related()函数对数据库查询的优化
Apr 01 Python
使用Python编写vim插件的简单示例
Apr 17 Python
python实现识别相似图片小结
Feb 22 Python
Python进行数据提取的方法总结
Aug 22 Python
Python 含参构造函数实例详解
May 25 Python
PyTorch 1.0 正式版已经发布了
Dec 13 Python
python字符串中匹配数字的正则表达式
Jul 03 Python
Python定时任务工具之APScheduler使用方式
Jul 24 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
Sep 15 Python
Python Collatz序列实现过程解析
Oct 12 Python
python中scrapy处理项目数据的实例分析
Nov 22 Python
python数字图像处理之图像的批量处理
Jun 28 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实现多级树型菜单
2006/10/09 PHP
PHP curl 获取响应的状态码的方法
2014/01/13 PHP
Laravel框架实现的上传图片到七牛功能详解
2019/09/06 PHP
[IE&amp;FireFox兼容]JS对select操作
2007/01/07 Javascript
jquery BS,dialog控件自适应大小
2009/07/06 Javascript
Prototype 工具函数 学习
2009/07/23 Javascript
jQuery中outerWidth()方法用法实例
2015/01/19 Javascript
JavaScript获取文本框内选中文本的方法
2015/02/20 Javascript
javascript实现画不相交的圆
2015/04/07 Javascript
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
jquery实现二级导航下拉菜单效果
2015/12/18 Javascript
js添加千分位的实现代码(超简单)
2016/08/01 Javascript
Nodejs抓取html页面内容(推荐)
2016/08/11 NodeJs
jQuery动态生成Bootstrap表格
2016/11/01 Javascript
100行代码理解和分析vue2.0响应式架构
2017/03/09 Javascript
微信小程序 数据绑定及运算的简单实例
2017/09/20 Javascript
react 中父组件与子组件双向绑定问题
2019/05/20 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
2019/07/04 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
python学习之matplotlib绘制散点图实例
2017/12/09 Python
Django  ORM 练习题及答案
2019/07/19 Python
如何在Django配置文件里配置session链接
2019/08/06 Python
香港迪士尼乐园酒店预订:Hong Kong Disneyland Hotels
2017/05/02 全球购物
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
迅雷Cued工作心得体会
2014/01/27 职场文书
十八大报告观后感
2014/01/28 职场文书
店面销售职位的职责
2014/03/09 职场文书
给全校老师的建议书
2014/03/13 职场文书
交警个人先进事迹材料
2014/05/11 职场文书
家装业务员岗位职责
2015/04/03 职场文书
高中班主任寄语
2019/06/21 职场文书
传单、海报早OUT了,另类传单营销方案送给你!
2019/07/15 职场文书
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android
Golang jwt身份认证
2022/04/20 Golang