在 Python 中,一个函数正在运行,但从未被调用。这怎么可能

我目前正在使用以下代码来设置将在 Raspberry Pi 上运行的应用程序。将其设置为可以远程访问应用程序以进行输入和输出操作。在开始编写项目所需的代码之前,我试图了解这里发生了什么。


import socket

import threading


...


class chatServer(threading.Thread):

    def __init__(self, (socket, address)):

        threading.Thread.__init__(self)

        self.socket = socket

        self.address = address


    def run(self):

        lock.acquire()

        clients.append(self)

        lock.release()

        print '%s:%s connected.' % self.address

        while True:

            data = self.socket.recv(1024)

            if not data:

                break

            for c in clients:

                c.socket.send(data)

        self.socket.close()

        print '%s:%s disconnected.' % self.address

        lock.acquire()

        clients.remove(self)

        lock.release()



while True:  # wait for socket to connect

    # send socket to chatserver and start monitoring

    chatServer( s.accept() ).start()

我不明白它是如何工作的。很明显,线程正在进行,一个以主线程结束的分支结束,等待与服务器建立任何新连接。新线程在 "def run(self): 函数中的 "while True:" 语句中循环。


但是为什么第二个线程挂在“while True:”循环中?“def run(self) 函数从未被调用过,为什么它会运行?


拉莫斯之舞
浏览 312回答 2
2回答

有只小跳蛙

当你创建了“类的ChatServer(threading.Thread):”你到Python说,该类的ChatServer将继承的方法threading.Thread,即在所有的方法threading.Thread将被“复制”了的ChatServer。如果需要,可以通过键入dir(class)来检查类中包含的方法。目录(线程。线程)['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_bootstrap', '_bootstrap_inner', '_delete', '_exc_info', '_initialized', '_reset_internal_locks', '_set_ident', '_set_tstate_lock', '_stop', '_wait_for_tstate_lock', 'daemon', 'getName', 'ident', 'isAlive', 'isDaemon', 'is_alive', 'join', 'name', 'run', 'setDaemon', 'setName', 'start']如您所见, threading.Thread 有两个特殊的方法:run和start。在您的情况下,创建def run()时,您继承的继承的run方法将被覆盖...但是,方法start仍然保留在chatServer类中,请在控制台中键入dir(chatServer)进行检查。该方法 start 有一个可调用对象__call__ ,它调用 doh' 类中的 run(self) 方法。因此,这就是它正在运行的原因。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python