Skip to main content
 首页 » 编程设计

Python多线程不是并行执行的

2024年11月24日26hnrainll

我已经执行了以下 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()