为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉莫斯之舞 2021-05-31 13:05:28
我目前正在使用以下代码来设置将在 Raspberry Pi 上运行的应用程序。将其设置为可以远程访问应用程序以进行输入和输出操作。在开始编写项目所需的代码之前,我试图了解这里发生了什么。import socketimport 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) 函数从未被调用过,为什么它会运行?
查看完整描述

2 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

当你创建了“类的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 有两个特殊的方法:runstart

在您的情况下,创建def run()时,您继承的继承的run方法将被覆盖...但是,方法start仍然保留在chatServer类中,请在控制台中键入dir(chatServer)进行检查。该方法 start 有一个可调用对象__call__ ,它调用 doh' 类中的 run(self) 方法。因此,这就是它正在运行的原因。


查看完整回答
反对 回复 2021-06-01
  • 2 回答
  • 0 关注
  • 311 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号