Python进程间传递套接字问题

源码,主进程创建5个子进程,主进程接受client请求,并把套接字fd传给子进程,子进程负责获取套接字的连接。


import multiprocessing as mp
import logging
import socket
from multiprocessing.reduction import reduce_socket, rebuild_socket
logger = mp.log_to_stderr(logging.DEBUG)

def worker(queue):
    while True:
        reduced_socket = queue.get()
        # This is the line where I get  Bad file descriptor error:
        print reduced_socket[0](*reduced_socket[1])


if __name__ == '__main__':

    serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serversocket.bind(('',9090))
    serversocket.listen(5)
    num_workers = 5
    socket_queue = mp.Queue()

    worker_processes = [mp.Process(target=worker,args=(socket_queue,)) for i in range(num_workers)]
    for worker_process in worker_processes:
        worker_process.daemon = True
        worker_process.start()

    while True:
        client, address = serversocket.accept()
        client_handle = reduce_socket(client)
        socket_queue.put(client_handle)
在python2.7.2版本发生了以下错误



[SUBWARNING/MainProcess] thread for sharing handles raised exception : --------------------------------------------------------------------- Traceback (most recent call last): File "/usr/local/lib/python2.7/multiprocessing/reduction.py", line 127, in _serve send_handle(conn, handle_wanted, destination_pid) File "/usr/local/lib/python2.7/multiprocessing/reduction.py", line 80, in send_handle _multiprocessing.sendfd(conn.fileno(), handle) OSError: [Errno 9] Bad file descriptor ---------------------------------------------------------------------
经过调查,并且查看源码Modules\_multiprocessing\ multiprocessing.c 是在调用系统内核函数sendmsg()方法出现了错误。

但是此问题在2.7版本和2.7.3版本进行了修复,奇怪是在2.7.2没有修复,无奈我们只能升级python版本。

你可能感兴趣的:(python进程间通信,python进程间传递套接字)