Python-多线程套接字

迈克尔·B

据我了解,python一次只能运行1个线程,所以如果我要做这样的事情

import socket, select
from threading import Thread
import config

class Source(Thread):
    def __init__(self):
        self._wait = False
        self._host = (config.HOST, config.PORT + 1)
        self._socket = socket.socket()
        self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self._sock = None
        self._connections = []
        self._mount = "None"
        self._writers = []
        self._createServer()
        Thread.__init__(self)

    def _createServer(self):
        self._socket.bind(self._host)
        self._socket.listen(2)
        self._connections.append(self._socket)
        self._audioPackets=[]

    def _addPacket(self, packet):
        self._audioPackets.append(packet)

    def _removePacket(self, packet):
        self._audioPackets.remove(packet)

    def _getPacket(self):
        if len(self._audioPackets) > 0:
            return self._audioPackets[0]
        else:
            return None

    def _sendOK(self, sock):
        sock.send("OK")

    def _sendDenied(self, sock):
        sock.send("DENIED")

    def _sendMount(self, sock):
        sock.send("mount:{0}".format(self._mount))

    def _sendBufPacket(self, sock, packet):
        packet = "buffer:%s" % packet
        sock.send(packet)

    def recv(self, sock, data):
        data = data.split(":", 1)
        if data[0] == "WAIT": self._wait = True
        elif data[0] == "STOP_WAITING": self._wait = False
        elif data[0] == "LOGIN":
            if data[1] == config.SOURCE_AUTH:
                self._source = sock
                self._sendOK(sock)
            else:
                self._sendClose(sock)
        elif data[0] == "MOUNT":
            if self._source == sock:
                self._mount = data[1]
            else:
                self._sendClose(sock)

        elif data[0] == "CLIENT":
            self._sendMount(sock)
            self._writers.append(sock)


    def _sendCloseAll(self):
        for sock in self._connections:
            sock.send("CLOSE")
            sock.close()

    def _sendClose(self, sock):
        sock.send("CLOSE")
        sock.close()

    def main(self):
        while True:
            rl, wl, xl = select.select(self._connections, self._writers, [], 0.2)
            for sock in rl:
                if sock == self._socket:
                    con, ip = sock.accept()
                    self._connections.append(con)
                else:
                    data = sock.recv(config.BUFFER)
                    if data:
                        self.recv(sock, data)
                    else:
                        if sock in self._writers:
                            self._writers.remove(sock)
                        if sock in self._connections:
                            self._connections.remove(sock)
            for sock in wl:
                packet = self._getPacket()
                if packet != None:
                    self._sendBufPacket(sock, packet)

    def run(self):
        self.main()

class writeThread(Thread):
      def __init__(self):
          self.running = False

      def make(self, client):
          self.client = client
          self.running = True

      def run(self):
          host = (config.HOST, config.PORT+1)
          sock = socket.socket()
          sock.connect(host)
          sock.send("CLIENT")
          sock.send("MOUNT:mountpoint")
          while self.running:
              data = sock.recv(config.BUFFER)
              if data:
                  data = data.split(":", 1)
                  if data[0] == "buffer":
                     self.client.send(data[1])
                  elif data[0] == "CLOSE":
                       self.client.close()
                       break


if __name__=="__main__":
    source = Source()
    source.start()
    webserver = WebServer()
    webserver.runloop()

如果我需要构建网络服务器部分,我会的。但是,我会解释。好的,所以基本上,当有人在设置的安装点下连接到Web服务器时,他们将到达那里自己的个人线程,然后从该线程中获取数据Source()并将其发送给他们。现在说另一个人连接到安装点,最后一个客户端以及源仍在运行。考虑到有两个活动线程,是否会阻止新客户端获取源数据?

Cyb3rFly3r

根据您所提出的问题,您对Threads如何在Python中工作的理解似乎是不正确的。如果使用正确,线程将不会阻塞:您可以使用Python实例化多个线程。局限性在于,由于全局解释器锁(GIL),您无法在线程编程中获得预期的完全并行性(例如,同时执行并因此减少了运行时间)。在您的情况下,将发生两个线程一起执行与顺序执行它们所花费的时间相同的时间(尽管这不一定在实践中会发生)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python-多线程套接字

来自分类Dev

python中(多线程)套接字的列表/数组

来自分类Dev

python 多线程和套接字连接问题

来自分类Dev

如何在python中运行多线程以进行多客户端套接字编程?

来自分类Dev

Python 中的多线程套接字。我错过了一些东西

来自分类Dev

套接字和线程python

来自分类Dev

套接字和线程python

来自分类Dev

套接字用于多线程?

来自分类Dev

通过套接字发送python,线程

来自分类Dev

线程中的Python套接字接收

来自分类Dev

如何在Python中制作一个能记住客户端的简单多线程套接字服务器

来自分类Dev

带套接字的多线程文件传输

来自分类Dev

带套接字的多线程JAVA

来自分类Dev

带套接字的Java GUI多线程

来自分类Dev

TCP IP 套接字和多线程

来自分类Dev

Python线程将无法开始使用套接字

来自分类Dev

从线程调用时,Python 套接字 accept() 不起作用

来自分类Dev

Python 套接字 - 关闭线程以允许更多用户

来自分类Dev

提升:多线程性能,线程/套接字的重用

来自分类Dev

提升:多线程性能,线程/套接字的重用

来自分类Dev

协助Python多线程

来自分类Dev

Python Webdriver多线程

来自分类Dev

多线程python请求

来自分类Dev

Python多线程方法

来自分类Dev

协助Python多线程

来自分类Dev

Python抓取多线程

来自分类Dev

python多线程性能

来自分类Dev

多线程python请求

来自分类Dev

Python中的多线程