Multiprocessing and sockets in Python

前端 未结 3 1709
后悔当初
后悔当初 2021-02-02 04:02

I am trying to make multiprocessing and socket programming work together, but, I am stuck at this point. Problem is that, I am getting this error:

  File \"multi         


        
相关标签:
3条回答
  • 2021-02-02 04:20

    After working on this for a while, I decided to approach this problem from a different angle, and following method seems to be working for me.

    import multiprocessing as mp
    import logging
    import socket
    import time
    
    logger = mp.log_to_stderr(logging.DEBUG)
    
    def worker(socket):
        while True:
            client, address = socket.accept()
            logger.debug("{u} connected".format(u=address))
            client.send("OK")
            client.close()
    if __name__ == '__main__':
        num_workers = 5
    
        serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        serversocket.bind(('',9090))
        serversocket.listen(5)
    
        workers = [mp.Process(target=worker, args=(serversocket,)) for i in
                range(num_workers)]
    
        for p in workers:
            p.daemon = True
            p.start()
    
        while True:
            try:
                time.sleep(10)
            except:
                break
    
    0 讨论(0)
  • 2021-02-02 04:25

    I'm not an expert so I can't give the real explanation but if you want to use queues, you need to reduce the handle and then recreate it:

    in your main :

    client, address = serversocket.accept()
    client_handle = multiprocessing.reduction.reduce_handle(client.fileno())
    socket_queue.put(client_handle)
    

    and in your worker:

    clientHandle = queue.get()
    file_descriptor = multiprocessing.reduction.rebuild_handle(client_handle)
    clientsocket = socket.fromfd(file_descriptor, socket.AF_INET, socket.SOCK_STREAM)
    

    also

    import multiprocessing.reduction
    

    That will work with your original code. However, I am currently having problems with closing sockets in worker processes after they were created as I described.

    0 讨论(0)
  • 2021-02-02 04:38

    Here is some working code on what's mentioned above - https://gist.github.com/sunilmallya/4662837 multiprocessing.reduction socket server with parent processing passing connections to client after accepting connections

    0 讨论(0)
提交回复
热议问题