2013-03-14 85 views
1

一个进程正在从套接字接收数据,然后将其放入队列中,另一个进程正在处理排队的数据。如何让它们同时运行?如何同时运行2个不同的进程?

此套接字为serve_forever,而数据处理仅在队列不为空时才会运行。

+0

你想要2个并行进程或线程吗? – kaspersky 2013-03-14 07:06:05

+0

我想要2个并行进程。我只需要第二个过程是线性的。 – jeanette18 2013-03-14 07:09:08

+4

'multiprocessing'模块 – wim 2013-03-14 07:11:47

回答

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 2013-03-14 08:25:23

+1

这是一个很好的多处理示例:http://pymotw.com/2/multiprocessing/ – 2013-03-14 08:46:54

+0

谢谢@iUngi!我想我现在有领先。 – jeanette18 2013-03-14 09:26:38

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" 
相关问题