python 다 중 스 레 드 와 대기 열 을 이용 하여 셸 프로그램 을 관리 합 니 다.
4389 단어 가로막다대열geventpython 다 중 스 레 드
예 를 들 어:
모든 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 은 시간 초과 시간 을 나타 내 는 수치 형식 입 니 다. 이 매개 변 수 를 제공 하지 않 으 면 메 인 스 레 드 는 스 레 드 가 끝 날 때 까지 막 힙 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
스프링mvc 차단기 정적 자원 차단springmvc 차단기 인터셉터 springmvc 차단기는 요청한 자원 경로를 차단할 수 있어 차단기의 쓰기를 크게 간소화할 수 있습니다.그러나 제발 주의해야 할 것은 정적 자원의 방출이다. 위 코드: 문제가 생겼...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.