我已经执行了以下 Python 代码。
from time import sleep
from threading import *
class myclass1(Thread):
def run(self):
for i in range(5):
print("aaa")
sleep(1)
class myclass2(Thread):
def run(self):
for i in range(5):
print("bbb")
sleep(1)
mc1 = myclass1()
mc2 = myclass2()
mc1.start()
mc2.start()
输出包含“aaabbb”。
aaa
bbb
aaabbb
aaa
bbb
aaa
bbb
aaa
bbb
我不明白为什么结果包含“aaabbb”。这是否意味着 print("aaabbb") 是在一个线程中执行的?
请您参考如下方法:
标准输出在任何时候都可以写入两个线程,所以如果一个线程在另一个线程向标准输出写入一行的中间向标准输出写入一行,那么您会看到来自两个线程的行得到混在一起。
为避免这种竞争情况,您可以使用 threading.Lock 来确保每次始终只有一个线程可以调用 print,并且另一个线程将被阻塞,直到 print 返回后释放锁:
from time import sleep
from threading import *
class myclass(Thread):
def __init__(self, name, lock, *args, **kwargs):
super().__init__(*args, **kwargs)
self.name = name
self.lock = lock
def run(self):
for i in range(5):
with self.lock:
print(self.name)
sleep(1)
lock=Lock()
mc1 = myclass('aaa', lock)
mc2 = myclass('bbb', lock)
mc1.start()
mc2.start()
