python 다 중 스 레 드 와 대기 열 을 이용 하여 셸 프로그램 을 관리 합 니 다.

먼저 환경 을 설명 하 겠 습 니 다. 기계 에 여러 개의 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('
')     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('
')     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.center(20,'*')         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)     L=[]                                  #     while n > 0:                          # ,         data=in_q.get()         n -= 1         data1 = commands.getoutput(''' echo " %s " | egrep "Starting|Stopping" |awk 'NR==1{print $3}'  ''' %data)         # data,         L.append(data1)         print "
%s 
" %L         print '\033[1;31;40m'         print data         print '
%s  , ,
' %list(set(servername).difference(set(L)))                # , 。         print '\033[0m'     print '\033[1;31;40m'     print ' !!!!!!!'     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 은 시간 초과 시간 을 나타 내 는 수치 형식 입 니 다. 이 매개 변 수 를 제공 하지 않 으 면 메 인 스 레 드 는 스 레 드 가 끝 날 때 까지 막 힙 니 다.

좋은 웹페이지 즐겨찾기