浅谈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正则表达式操作指南(re使用)
Sep 06 Python
python爬虫入门教程之糗百图片爬虫代码分享
Sep 02 Python
编程语言Python的发展史
Sep 26 Python
Python实现批量下载图片的方法
Jul 08 Python
详解JavaScript编程中的window与window.screen对象
Oct 26 Python
详解Python核心对象类型字符串
Feb 11 Python
Linux CentOS Python开发环境搭建教程
Nov 28 Python
python绘制散点图并标记序号的方法
Dec 11 Python
Python 微信爬虫完整实例【单线程与多线程】
Jul 06 Python
使用 Python ssh 远程登陆服务器的最佳方案
Mar 06 Python
python使用matplotlib绘制折线图的示例代码
Sep 22 Python
python实战之90行代码写个猜数字游戏
Apr 22 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
实现“上一页”和“下一页按钮
2006/10/09 PHP
php垃圾代码优化操作代码
2010/08/05 PHP
PHP APC的安装与使用详解
2013/06/13 PHP
ThinkPHP行为扩展Behavior应用实例详解
2014/07/22 PHP
PHP实现的超长文本分页显示功能示例
2018/06/04 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
node.js中的path.extname方法使用说明
2014/12/09 Javascript
JavaScript实现自动生成网页元素功能(按钮、文本等)
2015/11/21 Javascript
Node.js Streams文件读写操作详解
2016/07/04 Javascript
JS插件plupload.js实现多图上传并显示进度条
2016/11/29 Javascript
bootstrapValidator自定验证方法写法
2016/12/01 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
AngularJS基于provider实现全局变量的读取和赋值方法
2017/06/28 Javascript
详解weex默认webpack.config.js改造
2018/01/08 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
微信小程序自定义tabBar组件开发详解
2020/09/24 Javascript
nodejs开发一个最简单的web服务器实例讲解
2020/01/02 NodeJs
2018年Python值得关注的开源库、工具和开发者(总结篇)
2018/01/04 Python
Python基于生成器迭代实现的八皇后问题示例
2018/05/23 Python
使用pycharm设置控制台不换行的操作方法
2019/01/19 Python
对python借助百度云API对评论进行观点抽取的方法详解
2019/02/21 Python
pandas dataframe的合并实现(append, merge, concat)
2019/06/24 Python
Django Rest framework权限的详细用法
2019/07/25 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
pytorch如何冻结某层参数的实现
2020/01/10 Python
python time()的实例用法
2020/11/03 Python
远程培训的心得体会
2014/09/01 职场文书
市场营销工作计划书
2014/09/15 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
英文慰问信范文
2015/03/24 职场文书
上甘岭观后感
2015/06/10 职场文书
2015年小学教师培训工作总结
2015/07/21 职场文书
新手初学Java List 接口
2021/07/07 Java/Android
idea下配置tomcat避坑详解
2022/04/12 Servers