user4995138
user4995138

Reputation:

using multiprocessing to handle socket

I have a server with main process acepting socket connections and put them in Queue stack and another process monitoring this stack and applying it to pool processes handling connections. All works fine except for one thing:

from multiprocessing import Queue, Process, Pool, Manager
import datetime
import socket

def get_date():
    return datetime.datetime.now().strftime('%H:%M:%S')


class Server:
    def __init__(self, host, port):
        self.server_address = host, port
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


    def run(self):
        self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.server_socket.bind(self.server_address)
        self.server_socket.listen(1)

        print('listen at: %s:%s' % self.server_address)

        q = Manager().Queue()
        Process(target=self.handle_request, args=(q,)).start()

        while True:
            client_socket, adress = self.server_socket.accept()
            print('\n[%s] request from: %s:%s' % (get_date(), *adress))
            q.put(client_socket)
            client_socket.close()
            del client_socket  # client_socket.close() not working


    def help(self, client_socket):
        data = client_socket.recv(512)
        client_socket.send(data)
        client_socket.close()
        print(data[:50])

    def handle_request(self, q):
        with Pool(processes=2) as pool:
            while True:
                pool.apply_async(self.help, (q.get(),))


Server('localhost', 8000).run()

Upvotes: 0

Views: 1892

Answers (1)

georgexsh
georgexsh

Reputation: 16624

close doesn't realy close connection unless no other process holding a reference, but shutdown will affect all processes. you could call client_socket.shutdown(socket.SHUT_WR) before client_socket.close().


Update:

the reason close doesn't fully close connection is there is a process started by Manager() is holding a reference. Use Queue instead would make close works as you expected.

Upvotes: 2

Related Questions