Python快速入门(十二)多线程
前言:主要介绍使用threading创建多线程、查看当前运行的线程、验证创建线程以及运行的时间、线程共享全局变量以及带来的资源争夺问题,使用互斥锁解决资源争夺问题。
1.使用threading模块创建多线程
import time
import threading
def sing():
for i in range(10):
print("---正在唱---")
time.sleep(1)
def dance():
for i in range(5):
print("---跳舞---")
time.sleep(1)
def main():
t1 = threading.Thread(target=sing)
t2 = threading.Thread(target=dance)
t1.start()
t2.start()
if __name__ == '__main__':
main()
运行截图:
2.循环查看当前运行的线程
代码:
import threading
import time
def test1():
for i in range(10):
print("test1 %d" % i)
time.sleep(1)
def test2():
for i in range(10):
print("test2 %d" % i)
time.sleep(1)
def main():
t1 = threading.Thread(target=test1)
t2 = threading.Thread(target=test2)
t1.start()
t2.start()
while True:
print(threading.enumerate())
if len(threading.enumerate())<=1:
break
time.sleep(1)
if __name__ == '__main__':
main()
运行截图:
3.验证创建线程以及运行的时间
代码:
import threading
import time
def test1():
for i in range(5):
print("test1 %d" % i)
time.sleep(1)
def main():
# 在调用Thread之前先打印当前线程信息
print(threading.enumerate())
t1 = threading.Thread(target=test1)
# 在调用Thread之后打印
print(threading.enumerate())
t1.start()
# 在调用start之后打印
print(threading.enumerate())
if __name__ == '__main__':
main()
运行截图:
4.函数里面修改全局变量
代码:
num = 100
nums = [11, 22]
def test():
global num
num += 100
def test2():
nums.append(33)
print(nums)
print(num)
test()
test2()
print(nums)
print(num)
运行截图:
5.线程共享全局变量
代码:
import threading
import time
g_num = 100
def test1():
global g_num
g_num += 1
print("test1 g_num %d" % g_num)
def test2():
print("test2 g_num %d" % g_num)
def main():
t1 = threading.Thread(target=test1)
t2 = threading.Thread(target=test2)
t1.start()
time.sleep(1)
t2.start()
time.sleep(1)
print("-----in main Thread g_num = %d---" % g_num)
if __name__ == '__main__':
main()
运行截图:
6.共享全局变量带来的问题-资源争夺
代码:
import threading
import time
g_num = 0
def test1(num):
global g_num
for i in range(num):
g_num += 1
print("test1 g_num%d" % g_num)
def test2(num):
global g_num
for i in range(num):
g_num += 1
print("test2 g_num%d" % g_num)
def main():
t1 = threading.Thread(target=test1, args=(100000,))
t2 = threading.Thread(target=test1, args=(200000,))
t1.start()
t2.start()
time.sleep(5)
print("-----in main Thread g_num = %d---" % g_num)
if __name__ == '__main__':
main()
运行截图:
7.使用互斥锁解决资源争夺问题
代码:
import threading
import time
g_num = 0
mutex = threading.Lock()
def test1(num):
global g_num
# 上锁 如果之前没有上锁,那么此时 上锁成功
# 如果上锁之前 已经上锁了,那么此时会堵塞在这里,知道这个锁被解开位置
mutex.acquire()
for i in range(num):
g_num += 1
#解锁
mutex.release()
print("test1 g_num%d" % g_num)
def test2(num):
global g_num
mutex.acquire()
for i in range(num):
g_num += 1
mutex.release()
print("test2 g_num%d" % g_num)
def main():
t1 = threading.Thread(target=test1, args=(100000,))
t2 = threading.Thread(target=test1, args=(200000,))
t1.start()
t2.start()
time.sleep(5)
print("-----in main Thread g_num = %d---" % g_num)
if __name__ == '__main__':
main()
运行截图:
结束!!!