python在创建多线程时,需要引用threading库
Thread类创建多线程
Thread类创建多线程,将需要执行的函数作为target参数传入其中
def Coding():
for x in range(3):
print("正在写代码%s" % threading.current_thread())
time.sleep(1)
def Drwading():
for x in range(3):
print("正在画代码%s" % threading.current_thread())
time.sleep(1)
if __name__ == '__main__':
t1 = threading.Thread(target=Coding)
t2 = threading.Thread(target=Drwading)
t1.start()
t2.start()
继承Thread类创建多线程
通过Thread类创建多线程时,需要继承threading.Thread,并实现自己的run方法
import threading
import time
class CodingThread(threading.Thread):
def run(self):
for x in range(3):
print("正在写代码%s" % threading.current_thread())
time.sleep(1)
class DrawThread(threading.Thread):
def run(self):
for x in range(3):
print("正在画代码%s" % threading.current_thread())
time.sleep(1)
def main():
t1 = CodingThread()
t2 = DrawThread()
t1.start()
t2.start()
if __name__ == '__main__':
main()
使用锁机制实现数据安全修改
首先看下面的代码
V = 0
def incrimentV():
global V
for i in range(1000000):
V +=1
print("V = %s" % V)
if __name__ == '__main__':
t1 = threading.Thread(target=incrimentV)
t2 = threading.Thread(target=incrimentV)
t1.start()
t2.start()
执行结果如下,明显数据不对,出现这个现象是由于线程t1和t2同时访问V时,没有对数据安全访问,这时需要使用锁实现线程t1和t2对V的互斥访问
下面使用了线程锁对V操作时进行了互斥访问
V = 0
lock = threading.Lock()
def incrimentV():
global V
lock.acquire()
for i in range(1000000):
V +=1
lock.release()
print("V = %s" % V)
if __name__ == '__main__':
t1 = threading.Thread(target=incrimentV)
t2 = threading.Thread(target=incrimentV)
t1.start()
t2.start()
执行结果如下