创建多线程
Python中使用线程有两种方式:函数或者用类来包装线程对象。
函数包装线程对象:
import threading
import time
def test(x):
print(x)
time.sleep(2)
t1 = threading.Thread(target=test,args=(1))
t2 = threading.Thread(target=test,args=(2))
类包装线程对象:
import threading
import time
class myThread(threading.Thread):
#此时初始化已经把基类(threading)的初始化覆盖掉了
#要用super()
def __init__(self,n):
super(myThread,self).__init__()
self.n = n
#以类的方式实现多线程必须实现run方法
def run(self):
print(self.n)
time.sleep(3)
r1 = myThread(1)
r2 = myThread(2)
r1.start()
r2.start()
多线程特性
Thread创建的实例对象的常用方法:
-
start():启动子进程实例(创建子线程)
-
join([timeout]):是否等待子线程执行结束,或等待多少秒
-
threading.active_count():查看当前活动的线程个数
-
threading.current_thread():查看当前线程
import threading
import time
def run(x):
print(f"线程{x}")
time.sleep(2)
if __name__ == '__main__':
start_time = time.time()
t1 = threading.Thread(target=run, args=(1,))
t2 = threading.Thread(target=run, args=(2,))
t1.start()
t1.join()#等待2s
t2.start()
end_time = time.time()
print("程序运行时间:",end_time-start_time)
print(threading.active_count())#查看当前活动的线程个数
print(threading.current_thread())#查看当前线程
守护线程
使用setDaemon(True)把子线程变成主线程的守护线程,设置守护线程之后,当主线程结束时,子线程也将立即结束,不再执行。
import time
import threading
def run(n):
print('task',n)
time.sleep(1)
print('3s')
time.sleep(1)
print('2s')
time.sleep(1)
print('1s')
if __name__ == '__main__':
t=threading.Thread(target=run,args=('t1',))
t.setDaemon(True)#设置守护线程
t.start()
print('end')
线程锁
由于线程之间是进行随机调度,并且每个线程可能只执行n条执行之后,当多个线程同时修改同一条数据时可能会出现脏数据,所以出现了线程锁,即同一时刻允许一个线程执行操作。线程锁用于锁定资源,可以定义多个锁,当需要独占某一个资源时,任何一个锁都可以锁定这个资源,就好比用不同的锁都可以把这个相同的门锁住一样。
import threading
def run():
global x #全局变量
lock.acquire()#申请线程锁
x += 1
lock.release()
if __name__ == '__main__':
x = 0
res = []
lock = threading.Lock()#设置线程锁
for i in range(100):
t = threading.Thread(target=run)
t.start()
res.append(t)
for t in res:
t.join()
print(x)
递归锁
RLcok类的用法和Lock类一模一样,但它支持嵌套,在多个锁没有释放的时候一般会使用RLock类
import threading
import time
def func(lock):
global gl_num
lock.acquire()
gl_num += 1
time.sleep(1)
print(gl_num)
lock.release()
if __name__ == '__main__':
gl_num = 0
lock = threading.RLock()
for i in range(10):
t = threading.Thread(target=func,args=(lock,))
t.start()
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99499.html