同时线程和初始化(它是如何工作的?)

Thread and init at the same time (how it works?)

我最近开始研究线程,我知道它是关于多处理的东西我只是不明白为什么会这样

import threading

class BuckyMessenger(threading.Thread):
    def __init__(self, name):
        threading.Thread.__init__(self)
        print("test")

    def run(self):
        for _ in range(4):
            print(threading.current_thread().getName())

    x = BuckyMessenger(name='Send')
y = BuckyMessenger(name='Receive')
z = BuckyMessenger(name='Nothing')
x.start()
y.start()
z.start()

我预计会发生这种情况:

test
Send
test
Receive
test
Nothing

从这里开始,我应该再打印 9 张 3 随机 "Send" 和 3 随机 "Receive" 和 3 随机 "Nothing",如下所示:(其余结果)

Send
Receive 
Nothing 
Nothing
Nothing
Send
Receive 
Receive 
send

但这是我得到的结果: 我的意思是为什么?为什么 python 这样做?

test
test
test
Thread-1
Thread-1
Thread-1
Thread-1
Thread-2
Thread-2
Thread-2
Thread-2
Thread-3
Thread-3
Thread-3
Thread-3

您需要获取对当前线程的引用 运行 并设置其名称。然后您可以使用该引用来打印其名称。注意构造函数和 run 方法的变化。至于串行执行的效果,是由于每个线程能够执行得足够快并在另一个线程发生之前完成,因为循环次数很少:

import threading

class BuckyMessenger(threading.Thread):
    def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name
        print("test")

    def run(self):
        curThread = threading.current_thread()
        curThread.name = self.name
        for _ in range(4):
            print(curThread.name)

x = BuckyMessenger(name='Send')
y = BuckyMessenger(name='Receive')
z = BuckyMessenger(name='Nothing')
x.start()
y.start()
z.start()

可能的输出:

test
test
test
Send
Send
Send
Send
Receive
Nothing
Nothing
Receive
Nothing
Nothing
Receive
Receive

您的初始化程序没有将传递的 name 设置为 BuckyMessanger。这是因为您覆盖了原始的 Thread.__init__(),它按您预期的方式处理 name。线程的默认名称是 Thread-1 等等,按照它们各自的创建顺序。将您的初始值设定项更改为类似以下内容以覆盖默认值:

def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name
        print("test")

至于为什么要按此顺序打印,BuckyMessanger.run() 在每个 start() 之后运行并在调用下一个 start() 之前完成。