同时线程和初始化(它是如何工作的?)
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()
之前完成。
我最近开始研究线程,我知道它是关于多处理的东西我只是不明白为什么会这样
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()
之前完成。