我已经执行了以下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")
是在一个线程中执行的?
答案 0 :(得分:1)
标准输出可随时写入两个线程,因此,如果一个线程在另一线程的中间将一条线写入标准输出,则将一条线写入标准输出,然后您将看到两个线程的行搞混了。
为避免出现这种竞争状况,可以使用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()