国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

淺談python多線程和隊列管理shell程序

2019-11-25 17:06:18
字體:
來源:轉載
供稿:網友

首先來描述下環境,在機器上有很多個JAVA程序,我們在每個JAVA程序里都配置了一個啟動|停止|重啟的腳本

舉個例子:

我們現在要同時運行這些腳本,來達到快速啟動所有的JAVA程序,如果我們只用多線程的話,線程是不會返回消息給父進程,我們如何才能知道這些程序是啟動成功了呢?

所以我們用到了隊列來管理。

"""我試過gevent,但是會在command這里造成阻塞"""

gevent代碼如下  如果有朋友知道如何優化,請您告訴我

#!/usr/bin/python2.7# -*- coding:utf-8 -*-import os,sysfrom datetime import datetimeimport commandsimport gevent.monkeygevent.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 datetimeimport commandsfrom Queue import Queuefrom 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是一個數值類型,表示超時時間,如果未提供該參數,那么主調線程將一直堵塞到被調線程結束。

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鄂温| 隆昌县| 巨鹿县| 通山县| 鄂州市| 开平市| 普定县| 永仁县| 屏边| 独山县| 漠河县| 铜陵市| 盐边县| 西充县| 永和县| 岱山县| 丹东市| 革吉县| 丹凤县| 瓦房店市| 遂平县| 揭西县| 涿州市| 岳普湖县| 古交市| 华亭县| 濮阳市| 阜城县| 洞口县| 新津县| 福清市| 平遥县| 朝阳区| 高密市| 林西县| 定襄县| 高邑县| 化隆| 瓦房店市| 深水埗区| 荣昌县|