2012-06-22 5 views
2

다음 대기열에서 데이터를 처리하는 유휴 백그라운드 프로세스가 있습니다.이 프로세스는 다음과 같이 구현했습니다. 이 예제에서 전달 된 데이터는 단지 정수이지만 최대 1000 개의 정수를 가진 목록을 전달하고 초당 큐에 최대 100 개의 목록을 넣을 것입니다. 이것이 올바른 접근 방법입니까, 아니면 더 정교한 RPC 및 서버 메소드를 찾아야합니까?유휴 프로세스와의 파이썬 프로세스 간 통신

import multiprocessing 
import Queue 
import time 

class MyProcess(multiprocessing.Process): 

    def __init__(self, queue, cmds): 
     multiprocessing.Process.__init__(self) 
     self.q = queue 
     self.cmds = cmds 

    def run(self): 
     exit_flag = False 
     while True: 
      try: 
       obj = self.q.get(False) 
       print obj 
      except Queue.Empty: 
       if exit_flag: 
        break 
       else: 
        pass 
      if not exit_flag and self.cmds.poll(): 
       cmd = self.cmds.recv() 
       if cmd == -1: 
        exit_flag = True 
      time.sleep(.01) 

if __name__ == '__main__': 
    queue = multiprocessing.Queue() 
    proc2main, main2proc = multiprocessing.Pipe(duplex=False) 
    p = MyProcess(queue, proc2main) 
    p.start() 
    for i in range(5): 
     queue.put(i)  
    main2proc.send(-1) 
    proc2main.close() 
    main2proc.close() 
    # Wait for the worker to finish 
    queue.close() 
    queue.join_thread() 
    p.join() 

답변

0

데이터를 처리하는 데 걸리는 시간에 따라 다릅니다. 데이터 샘플이 없기 때문에 말할 수는 없지만 일반적으로 부하 분산, 보장 된 가동 시간 또는 확장 성이 필요할 때보다 정교한 RPC 및 서버 방법으로 전환하는 것이 좋습니다. 이러한 것들이 복잡성을 더해 응용 프로그램을 배포, 디버그 및 유지 관리하기가 더 어려워 질 수 있음을 기억하십시오. 또한 작업을 처리하는 데 걸리는 대기 시간이 늘어납니다 (문제 일 수도 있고 아닐 수도 있음).

필자는 샘플 데이터로 테스트하고 여러 서버가 제공하는 확장 성이 필요한지 여부를 결정합니다.