Asyncore调度程序在发送大量(流)数据时阻止整个应用程序

时间:2015-07-11 21:13:59

标签: python multithreading proxy stream asyncore

我正在尝试创建一个脚本,通过我的服务器(一个永不结束的.ts流)直播视频流。此外,此流正在通过另一个可以访问原始视频流的代理。

我设法写了一些有效的代码,它能够从原始源获取流,通过代理并将其流式传输到客户端,但它一次只能用于一个客户端(只有一个流)可以通过),应用程序的其余部分或其他请求只是保持挂起并永远不会完成,直到正在观看流的当前用户关闭它。

我正在使用asyncore调度程序,我认为这应该是已经实现了线程/异步并且它应该自己处理多个用户,但是我错了,或者我在代码中搞错了(这很可能是这种情况) )。

从下面的代码中可以看出,我使用asyncore中的示例客户端/服务器应用程序开始:

class EchoHandler(threading.Thread, asyncore.dispatcher):

  def __init__(self, sock):
    self.channel_lock = threading.Lock()
    asyncore.dispatcher.__init__(self, sock)

  def handle_read(self):
    self.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
    header = self.recv(300)
    header = str(header)
    url =  (header.split('\n', 1)[0])[5:-10]
    threading.Thread(target=self.send_stream(), args=(url, ))
    #self.send_stream(url)

    #if data:
        #self.send(data)

  def handle_close(self):
    self.s.close()
    print "Connection closed"
    self.close()

  def send_stream(self, url):
    CRLF = "\r\n"

    request = [
        "GET "+ url +" HTTP/1.1",
        "Host: X.X.X.X",
        "Connection: Close",
        "",
        "",
    ]

    # Connect to the server
    self.s = socket.socket()
    self.s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
    self.s.connect(('X.X.X.X', 3128))

    # Send an HTTP request
    self.s.send(CRLF.join(request))

    # Get the response (in several parts, if necessary)
    response = ''
    buffer = self.s.recv(50)
    while buffer:
        self.send(buffer)
        buffer = self.s.recv(50)

    self.close()

class EchoServer(asyncore.dispatcher):

  def __init__(self, host, port):
    asyncore.dispatcher.__init__(self)
    self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
    self.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
    self.set_reuse_addr()
    self.bind((host, port))
    self.listen(50)

  def handle_accept(self):
    pair = self.accept()
    if pair is not None:
        sock, addr = pair
        print 'Incoming connection from %s' % repr(addr)
        EchoHandler(sock)

server = EchoServer('localhost', 5555)

asyncore.loop()

这基本上就是整个代码。

正如您可能也看到的那样,我曾尝试使用线程进行操作,但却没有尝试,因为它根本不起作用。

0 个答案:

没有答案