繁体   English   中英

使用多处理来处理套接字

[英]using multiprocessing to handle socket

我有一台服务器,其主进程接受套接字连接,并将其放入队列堆栈,另一个进程监视该堆栈,并将其应用于处理连接的池进程。 除了一件事,一切正常:

  • 最后一个连接一直处于阻塞状态,直到出现另一个连接,看来最后一个连接无法关闭,但是为什么呢?
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()

除非没有其他进程持有引用,否则close不会真正关闭连接,但是shutdown将影响所有进程。 您可以在client_socket.close()之前调用client_socket.shutdown(socket.SHUT_WR) client_socket.close()


更新:

close未完全关闭连接的原因是Manager()启动的进程正在保存引用。 使用Queue可以使close工作如您所愿。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM