多线程的运用
首先确定你要调用的库
import threading
import time
接着因为是刚学,所以我打算用两个子线程对同一个参数进行加减法运算,所以我本着自上而下的的思路决定先定义主程序,也不想定义类,所以我把构造线程的一些列操作放在了主函数中,主要放的是对加法减法所用到的子线程的定义,让加减法线程开始工作的的方法,还有加减法线程的等待。
if __name__ = '__main__':
thread_add = threading.Thread(target = app)
thread_sub = threading.Thread(target = sub)
thread_add.start()
thread_sub.start()
thread_add.join()
thread_sub.join()
接着我们开始定义加减法方法,在之前我们先把锁放下,已经n的初始值
lock= threading.Lock()
n = 0
def add():
global n
for _ in range(500000):
with lock:
n += 1
def sub():
global n
for _ in range(500000):
with lock:
n -= 1
其中关于用with语句上锁的优点是with语句有点:出异常也会release。当然也可以用try example
lock.acquire()
try:
n += 1
finally:
lock.release()
或是直接用
for _ in range(500000):
lock.acquire()#上锁
n += 1
lock.release()#解锁
完整的代码如下
import threading
import time
lock = threading.Lock()
n = 0
def add():
global n
for _ in range(500000):
# lock.acquire()#上锁
with lock: #with语句有点:出异常也会release
n += 1
# lock.release()#解锁
# lock.acquire()
# try:
# n += 1
# finally:
# lock.release()
def sub():
global n
for _ in range(400000):
# lock.acquire()
with lock:
n -= 1
# lock.release()
if __name__ == '__main__':
#main thread
thread_add = threading.Thread(target=add)#创造线程
thread_sub = threading.Thread(target=sub) # 创造线程
thread_add.start()#先调用谁,n先所在把哪个方法里
thread_sub.start()#执行线程
thread_add.join() # join start之后就可以进行了 join本身会等在那等待加法进行完成
thread_sub.join() # join的作用:等待子线程完成后执行主线程,使打印结果合理
print('n = ', n,flush = True)
结果呢如下