多线程、特性、线程锁和递归锁

导读:本篇文章讲解 多线程、特性、线程锁和递归锁,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

创建多线程

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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!