Linux에서 Django를 실행 중이며 뷰가 있고 그 뷰가 이라는 서브 프로세스의 데이터를 반환하도록하려는 경우 likeso 예를 들어, 뷰가 생성하는 파일에서 작동 cmd를 : 이제Django에서 시작 시간이 느린 서브 프로세스를 호출하는 방법
def call_subprocess(request):
response = HttpResponse()
with tempfile.NamedTemporaryFile("W") as f:
f.write(request.GET['data']) # i.e. some data
# cmd operates on fname and returns output
p = subprocess.Popen(["cmd", f.name],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = p.communicate()
response.write(p.out) # would be text/plain...
return response
, cmd를가 매우 느린 시작 시간이 생각하지만, 매우 빠른 작동 시간, 그리고 기본적으로 데몬 모드가 없습니다. 이 견해의 응답 시간을 향상시키고 싶습니다.
내가 그들을 입력 대기가 있고, 하나 물어 call_process을 가지고, 전체 시스템이 훨씬 빠르게 노동자 - 풀 cmd를의 인스턴스의 수를 시작하여 실행하는 것하고 싶습니다 작업자 풀 프로세스 중 하나가 데이터를 처리합니다.
부 cmd를 및 입력 cmd를 대기를 호출 1. 기능 :
이 정말이 개 부분이다. 이는 파이프 (예 :
)def _run_subcmd():
p = subprocess.Popen(["cmd", fname],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
# write 'out' to a tmp file
o = open("out.txt", "W")
o.write(out)
o.close()
p.close()
exit()
def _run_cmd(data):
f = tempfile.NamedTemporaryFile("W")
pipe = os.mkfifo(f.name)
if os.fork() == 0:
_run_subcmd(fname)
else:
f.write(data)
r = open("out.txt", "r")
out = r.read()
# read 'out' from a tmp file
return out
def call_process(request):
response = HttpResponse()
out = _run_cmd(request.GET['data'])
response.write(out) # would be text/plain...
return response
2 부로 수행 할 수 있습니다. 데이터를 기다리는 백그라운드에서 실행중인 근로자 세트. 즉, 하위 프로세스가 이미 실행되도록 위의 내용을 확장하려고합니다.
def init_workers(): # create WORKERS_COUNT workers
for i in xrange(0, WORKERS_COUNT):
tmp_file = tempfile.NamedTemporaryFile()
WORKERS.push(Worker(i))
: 장고 인스턴스가 초기화, 또는이 call_process가 처음 호출 될 때, 이러한 노동자의 집합이 같은 곳 근로자의 일부 초기화,이 있어야한다
WORKER_COUNT = 6
WORKERS = []
class Worker(object):
def __init__(index):
self.tmp_file = tempfile.NamedTemporaryFile("W") # get a tmp file name
os.mkfifo(self.tmp_file.name)
self.p = subprocess.Popen(["cmd", self.tmp_file],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
self.index = index
def run(out_filename, data):
WORKERS[self.index] = Null # qua-mutex??
self.tmp_file.write(data)
if (os.fork() == 0): # does the child have access to self.p??
out, err = self.p.communicate()
o = open(out_filename, "w")
o.write(out)
exit()
self.p.close()
self.o.close()
self.tmp_file.close()
WORKERS[self.index] = Worker(index) # replace this one
return out_file
@classmethod
def get_worker() # get the next worker
# ... static, incrementing index
만들어집니다 자, 내가 위에있는 것은 likeso가된다 : 지금 , 질문 :
이 방법이 유용할까요? (필자는 StackOverflow에 머리 꼭대기에서 이것을 입력 했으므로 문제는 있지만 개념적으로는 효과가 있음을 확신합니다)
무엇이 문제인가요?
더 나은 대안이 있습니까? 예 : 쓰레드가 잘 작동 할 수 있습니까? (데비안 레니 리눅스입니까?) 이와 같이 병렬 프로세스 작업자 - 풀을 처리하는 라이브러리가 있습니까?
내가 장만해야 할 장고와의 상호 작용이 있습니까?
감사합니다! 나는 이것이 내가하는 것처럼 흥미로운 문제로 생각하기를 바랍니다.
브라이언
이것은 흥미 롭습니다 - 나는 그것에 대해 조사 할 것입니다. 그러나, 내가 가질 수도 있고 가지지 않을 수도있는 문제는 # 4 ("실행 중", 즉 LaTeX가 시작됨)의 파트 1이 # 2 ("CMD가 큐에 추가 됨", 즉 LaTeX가 데이터를 가져 오기 전에)). 그러나 샐러리가이 일을 할 수 있다고 확신합니다. 그러나 약간의 파고가 필요합니다. 고맙습니다 Asksol. –