Python2.7 线程结束后的函数调用

2021-04-01 18:00:28 +08:00
 QBugHunter

首先是个线程类

class MyThread(threading.Thread):

    allName = []
    
    def __init__(self):
        threading.Thread.__init__(self)
        
    def run(self):
        pass
    
    def printMyName(self, nm):
        self.allName.append(nm)
        for n in self.allName:
            print n

然后有个类会回调用该函数,类似观察者模式

class OB

    funPtr = []
    
    def __init__(self):
        print "请不要初始化该类"
        
    @classmethod
    def registerPtr(cls, ptr):
        funPtr.append(ptr)
        
    @classmethod
    def callBackPtr(cls, nm):
        for ptr in cls.funPtr:
            ptr(nm)

然后 OB 类回不断有下列调用

A = MyThread()
OB.register(A.printMyName)
A.start()
# 线程运行结束
OB.callBackPtr("Jack")  # 这个调用时,线程类对象 A 已经运行完了

我想问下,这种情况下,线程 A 的 run 函数以及跑完的情况下,OB 类再调用对象 A 的 printMyName ()安全吗?

另外我想了一个方案,测试可行,但我不确定是否有问题,首先再 OB 类加了一个 unregister()函数


@classmethod
def unregister(cls, ptr):
    index = -1
    for p int cls.funPtr:
        if p == ptr:
            break
        index += 1
    if index != -1:
        del cls.funPtr[index]

然后在线程的 run 函数最后加一句

OB.unregister(self.printMyName)
1638 次点击
所在节点    Python
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/767295

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX