2013-03-14 2 views
1

하나의 프로세스가 소켓에서 데이터를 수신 한 다음 대기열에 넣고 다른 프로세스가 대기중인 데이터를 처리 중입니다. 둘을 동시에 운영하는 방법?동시에 두 개의 다른 프로세스를 실행하는 방법은 무엇입니까?

이 소켓은 serve_forever이며 큐 처리가 비어 있지 않은 경우에만 데이터 처리가 실행됩니다.

+0

2 개의 병렬 프로세스 또는 스레드를 원하십니까? – kaspersky

+0

2 개의 병렬 프로세스가 필요합니다. 두 번째 프로세스가 선형이어야합니다. – jeanette18

+4

'다중 처리'모듈 – wim

답변

0

서버 또는 클라이언트 응용 프로그램이있는 경우에도 다릅니다. 사용할 수있는 것보다 서버 인 경우

SocketServer.TCPServer.allow_reuse_address = True  

    self.server = TCPFactory((HOST, PORT), TCPRequestHandler, params)      

    # Start a thread with the server   
    self.server_thread = threading.Thread(target = self.server.serve_forever) 


    self.server_thread.setDaemon(True)  
    self.server_thread.start() 

class TCPFactory(SocketServer.ThreadingTCPServer):  


    def __init__(self, server_address, RequestHandlerClass, params): 
     """ 
     """ 

     SocketServer.ThreadingTCPServer.__init__(self, server_address, RequestHandlerClass) 
     self.patrams = params 


class TCPRequestHandler(SocketServer.BaseRequestHandler): 

    def setup(self): 
     print self.server.params 
     pass 
    def handle(self): 
     pass 

따라서 클라이언트가 서버에 연결되어 있으면 새 스레드가 시작됩니다. setuphandler 함수가 자동으로 호출됩니다. 는 다른 스레드를 위해 당신은 타이머, 또는 다른 스레드

myt = Timer(2, chackque,()) 
myt.start() 

def chackque(): 
    if not myq.empty(): 
    #Do what you want 

를 사용하거나 그냥 다른 스레드를 시작할 수 있습니다 : 내가 그것을 작동 한

mythread = threading.Thread(target = chackque, args = (myargs,))   
mythread.setDaemon(True) 
mythread.start() 

def chackque(): 
    while True: 
     if not myq.empty(): 
     #Do what you want 
+0

예, 클라이언트와 서버 응용 프로그램을 가지고 있습니다. 이 수신 응용 프로그램은 서버 응용 프로그램이지만이 스레드를 만들지는 않습니다. 두 번째 프로세스가 선형이되기를 바랄뿐입니다. 한 번에 하나의 데이터 만 처리됩니다. 첫 번째 프로세스는 클라이언트 응용 프로그램에서 데이터를 수신합니다. 나는 멀티 프로세싱을 들여다 보았지만, 어떻게 작동하는지 이해하지 못하고있다. – jeanette18

+1

이것은 좋은 멀티 프로세싱 예제입니다. http://pymotw.com/2/multiprocessing/ –

+0

thanks to iungi! 나는 이제 리드가 있다고 생각해. – jeanette18

1

합니다. 이것이 대답인지 아닌지 모르겠습니다. 그러나 그것은 잘 작동하고 있습니다. 어쩌면 버그가있을 수도 있고 없을 수도 있습니다 (아무도 없습니다). 개선을위한 제안은 언제나 환영합니다.

import multiprocessing 
import socket 
from multiprocessing import Process, Queue 
import time 

def handle(connection, address): 
    try: 
    while True: 
     data = connection.recv(1024) 
     if data == "": 
     break 
     else : 
     print "RECEIVE DATA : " + str(data) 
     xdata = data.strip() 
     xdata = data.split(" ") 
     for xd in xdata : 
      print "PUT Task : " + str(xd) 
      QueueTask.put((xd), block=True, timeout=5) 
     connection.sendall(data) 
    except: 
    print "Problem handling request" 
    finally: 
    connection.close() 

class Server(object): 
    def __init__(self, hostname, port): 
    self.hostname = hostname 
    self.port = port 

    def start(self): 
    self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    self.socket.bind((self.hostname, self.port)) 
    self.socket.listen(1) 
    while True: 
     conn, address = self.socket.accept() 
     process = multiprocessing.Process(target=handle, args=(conn, address)) 
     process.daemon = True 
     process.start() 

def f_Processor(): 
    time.sleep(10) 
    print 'PROCESSOR Starting' 
    while 1: 
    try : 
     job = QueueTask.get(True,1) 
     print "GET Task : " + str(job) 
     time.sleep(5) 
    except Exception as err : 
     pass 
    print 'PROCESSOR Exiting' 

if __name__ == "__main__": 
    server = Server("localhost", 9999) 
    QueueTask = Queue() 
    try: 
    p = multiprocessing.Process(name='Processing', target=f_Processor) 
    p.start() 
    server.start() 
    p.join() 
    except: 
    print "Unexpected exception" 
    finally: 
    for process in multiprocessing.active_children(): 
     process.terminate() 
     process.join() 
    print "All done" 
관련 문제