Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python与multiprocessing.Manager共享网络套接字_Python_Sockets_Networking_Process_Share - Fatal编程技术网

Python与multiprocessing.Manager共享网络套接字

Python与multiprocessing.Manager共享网络套接字,python,sockets,networking,process,share,Python,Sockets,Networking,Process,Share,我目前正在编写一个nginx代理服务器模块,前面有一个请求队列,因此当nginx后面的服务器无法处理请求时,请求不会被丢弃(nginx被配置为负载平衡器) 我正在使用 from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler 其思想是在处理请求之前将其放入队列中。我知道多处理。队列只支持简单对象,不能支持原始套接字,所以我尝试使用多处理。管理器来创建共享字典。管理器还使用套接字进行连接,因此此方法也失败。有没有办法在进程之间共享

我目前正在编写一个nginx代理服务器模块,前面有一个请求队列,因此当nginx后面的服务器无法处理请求时,请求不会被丢弃(nginx被配置为负载平衡器)

我正在使用

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
其思想是在处理请求之前将其放入队列中。我知道多处理。队列只支持简单对象,不能支持原始套接字,所以我尝试使用多处理。管理器来创建共享字典。管理器还使用套接字进行连接,因此此方法也失败。有没有办法在进程之间共享网络套接字? 下面是代码中有问题的部分:

class ProxyServer(Threader, HTTPServer):

    def __init__(self, server_address, bind_and_activate=True):
        HTTPServer.__init__(self, server_address, ProxyHandler,
                bind_and_activate)

        self.manager = multiprocessing.Manager()

        self.conn_dict = self.manager.dict()
        self.ticket_queue = multiprocessing.Queue(maxsize= 10)
        self._processes = []
        self.add_worker(5)


    def process_request(self, request, client):
        stamp = time.time()
        print "We are processing"

        self.conn_dict[stamp] = (request, client) # the program crashes here


    #Exception happened during processing of request from ('172.28.192.34', 49294)
    #Traceback (most recent call last):
    #  File "/usr/lib64/python2.6/SocketServer.py", line 281, in _handle_request_noblock
    #    self.process_request(request, client_address)
    #  File "./nxproxy.py", line 157, in process_request
    #    self.conn_dict[stamp] = (request, client)
    #  File "<string>", line 2, in __setitem__
    #  File "/usr/lib64/python2.6/multiprocessing/managers.py", line 725, in _callmethod
    #    conn.send((self._id, methodname, args, kwds))
    #TypeError: expected string or Unicode object, NoneType found

        self.ticket_queue.put(stamp)


    def add_worker(self, number_of_workers):
        for worker in range(number_of_workers):
            print "Starting worker %d" % worker
            proc = multiprocessing.Process(target=self._worker, args = (self.conn_dict,))
            self._processes.append(proc)
            proc.start()

    def _worker(self, conn_dict):
        while 1:
            ticket = self.ticket_queue.get()

            print conn_dict
            a=0
            while a==0:
                try:
                    request, client = conn_dict[ticket]
                    a=1
                except Exception:
                    pass
            print "We are threading!"
            self.threader(request, client)
class ProxyServer(Threader,HTTPServer):
def_uuuinit_uuu(self、服务器地址、绑定和激活=True):
HTTPServer.\uuuuu init\uuuuuuuuuuuuuuuu(self,服务器地址,ProxyHandler,
绑定和激活)
self.manager=multiprocessing.manager()
self.conn_dict=self.manager.dict()
self.ticket\u queue=多处理.queue(maxsize=10)
self._进程=[]
自我添加工作人员(5)
def过程_请求(自身、请求、客户):
stamp=time.time()
打印“我们正在处理”
self.conn_dict[stamp]=(请求,客户端)#程序在此崩溃
#处理来自('172.28.192.34',49294'的请求时发生异常
#回溯(最近一次呼叫最后一次):
#文件“/usr/lib64/python2.6/SocketServer.py”,第281行,在“handle\u request\u noblock”中
#自我处理请求(请求、客户地址)
#文件“/nxproxy.py”,第157行,正在处理请求
#self.conn_dict[stamp]=(请求,客户端)
#文件“”,第2行,在集合项中__
#文件“/usr/lib64/python2.6/multiprocessing/managers.py”,第725行,在调用方法中
#conn.send((self.\u id,methodname,args,kwds))
#TypeError:应为字符串或Unicode对象,未找到非类型
自助售票排队(盖章)
def添加工作人员(自身、工作人员数量):
对于范围内的工人(工人数量):
打印“起始工作人员%d”%worker
proc=multiprocessing.Process(target=self.\u worker,args=(self.conn\u dict,)
self.\u processs.append(proc)
程序启动()
def_工作人员(自身、控制):
而1:
ticket=self.ticket\u queue.get()
打印连接目录
a=0
当a==0时:
尝试:
请求,客户端=连接指令[票据]
a=1
除例外情况外:
通过
打印“我们正在穿线!”
self.threader(请求、客户端)

看起来您需要在进程之间切换(假设这里是Unix,对于Windows没有任何线索)。我从来没有在Python中这样做过,但这里有一个指向项目的链接,您可能需要检查。

U可以使用multiprocessing.reduce在进程之间传输连接和套接字对象

示例代码

# Main process
from multiprocessing.reduction import reduce_handle
h = reduce_handle(client_socket.fileno())
pipe_to_worker.send(h)

# Worker process
from multiprocessing.reduction import rebuild_handle
h = pipe.recv()
fd = rebuild_handle(h)
client_socket = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
client_socket.send("hello from the worker process\r\n") 

你可以看看这段代码,它是
multiprocessing.reduce套接字服务器,具有父处理功能,在接受连接后将连接传递给客户端

这是我一直在寻找的,它在python站点上没有很好的文档记录