发生这种情况的原因是,当多个线程写入流(stdout或文件)时,它们的输出几乎肯定会混合并产生无法读取的结果。您至少可以获得部分有序的输出,这主要是因为python有GIL。(顺便说一句,我得到了不同的输出。)一般情况下,当未指定语言时,没有任何东西可以阻止OS以以下方式调度线程执行:
index += 1
index += 1
print index
index += 1
print index
因此,一般来说,当您向共享变量写入*时,需要使用互斥体、信号量或其他同步原语来保护这部分代码,以确保线程可以执行整个
临界截面,临界截面
不被打断:
from threading import Thread, Lock
index_operations_lock = Lock()
def mutlithreading():
thread1.join()
thread2.join()
def fill():
global index
global running
while running:
with index_operations_lock:
if index >= 10:
running = False
return
index += 1
print index
保护您有争议的资源。另外,请注意,这种方法并没有指定线程执行的顺序。如果您需要先从线程1写入,然后再从线程2写入,那么您将需要再执行两个锁还是实现生产者-消费者模式(即,让两个线程在队列中写入,让第三个线程从队列中读取并写入文件/标准输出)。
*-在python中,赋值
a = b
也是一个写操作,因为这会增加由引用的对象中的引用计数器
b
.