Python 如何同时运行两个不同的进程?
一个进程从套接字接收数据,然后将其放入队列,另一个进程处理排队的数据。如何让它们同时运行Python 如何同时运行两个不同的进程?,python,sockets,parallel-processing,queue,Python,Sockets,Parallel Processing,Queue,一个进程从套接字接收数据,然后将其放入队列,另一个进程处理排队的数据。如何让它们同时运行 此套接字将永远为您服务,而数据处理将仅在队列不为空时运行。如果您有服务器或客户端应用程序,则此套接字也将视情况而定。如果它是一个服务器,那么您可以使用它 SocketServer.TCPServer.allow_reuse_address = True self.server = TCPFactory( ( HOST, PORT ), TCPRequestHandler, p
此套接字将永远为您服务,而数据处理将仅在队列不为空时运行。如果您有服务器或客户端应用程序,则此套接字也将视情况而定。如果它是一个服务器,那么您可以使用它
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
因此,如果客户端连接到服务器,它将启动一个新线程。设置
和
处理程序
函数将自动调用。
对于其他线程,可以使用计时器或其他线程
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
如果您有一个服务器或客户机应用程序,这也要视情况而定。如果它是一个服务器,那么您可以使用它
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
因此,如果客户端连接到服务器,它将启动一个新线程。设置
和
处理程序
函数将自动调用。
对于其他线程,可以使用计时器或其他线程
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
我让它工作。我不知道这是否是答案。但到目前为止,它正在发挥作用。也许有或者将会有bug(希望没有)。欢迎提出任何改进建议
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"
我让它工作。我不知道这是否是答案。但到目前为止,它正在发挥作用。也许有或者将会有bug(希望没有)。欢迎提出任何改进建议
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"
你想要两个并行进程还是线程?我想要两个并行进程。我只需要第二个过程是线性的。
multiprocessing
module我们将研究它。谢谢@wim你想要两个并行进程还是线程?我想要两个并行进程。我只需要第二个过程是线性的。multiprocessing
module我们将研究它。谢谢@wimyes,我有客户端和服务器应用程序。这个接收应用程序是服务器应用程序,但我不希望它创建线程。我只希望第二个过程是线性的。就像一次只处理一个数据一样。第一个进程将只接收来自客户端应用程序的数据。我研究了多处理,但我似乎无法理解它是如何工作的。是的,我有客户端和服务器应用程序。这个接收应用程序是服务器应用程序,但我不希望它创建线程。我只希望第二个过程是线性的。就像一次只处理一个数据一样。第一个进程将只接收来自客户端应用程序的数据。我研究了多重处理,但我似乎无法理解它是如何工作的。