在本文中,我们讨论了如何在Python中使用 threading
模块。
lock
)来防止竞态情况Queue
进行线程安全的数据/任务处理。你可以使用 threading.Thread()
创建一个线程。 它包含两个重要的参数:
target
:线程启动时要调用的该线程的可调用对象(函数)args
:目标函数的(函数)参数。 这必须是一个元组使用 thread.start()
启动线程
调用 thread.join()
告诉程序在继续执行其余代码之前,应等待该线程完成。
from threading import Thread
def square_numbers():
for i in range(1000):
result = i * i
if __name__ == "__main__":
threads = []
num_threads = 10
# 创建线程,并给每一个线程分配函数
for i in range(num_threads):
thread = Thread(target=square_numbers)
threads.append(thread)
# 启动所有线程
for thread in threads:
thread.start()
# 等待所有线程结束
# 阻塞主线程直到所有线程结束
for thread in threads:
thread.join()
由于线程位于相同的内存空间中,因此它们可以访问相同的(公共)数据。 因此,例如,你可以简单地使用所有线程都具有读取和写入访问权限的全局变量。
任务:创建两个线程,每个线程应访问当前数据库值,对其进行修改(在这种情况下,仅将其增加1),然后将新值写回到数据库值中。 每个线程应执行10次此操作。
from threading import Thread
import time
# 所有线程可以访问全局变量
database_value = 0
def increase():
global database_value # 需要可以修改全局变量
# 获取本地副本(模拟数据获取)
local_copy = database_value
# 模拟一些修改操作
local_copy += 1
time.sleep(0.1)
# 将计算的性质写入全局变量
database_value = local_copy
if __name__ == "__main__":
print('Start value: ', database_value)
t1 = Thread(target=increase)
t2 = Thread(target=increase)
t1.start()
t2.start()
t1.join()
t2.join()
print('End value:', database_value)
print('end main')
Start value: 0
End value: 1
end main