线程

作者: 鲸随浪起 | 来源:发表于2018-12-06 17:27 被阅读0次

    Thread创建线程,Lock互斥锁

    from threading import Thread,Lock
    xx = Thread(target=函数名)
    xx.start() #执行线程

    5个线程一起执行

    import threading
    import time
    def saySory():
        print("品爱的,我错了")
        time.sleep(1)
    if __name__ == '__main__':
        for i in range(5):
            #创建线程执行
            t = threading.Thread(target=saySory)
            #开始执行
            t.start()
    

    进程里面套线程
    进程是资源分配的单位,线程是CPU调度的单位

    主线程会等待所有子线程结束才结束

    import threading
    from time import sleep,ctime
    
    def sing():
        for i in range(3):
            print("正在唱歌...%d"%i)
            sleep(1)
    def dance():
        for i in range(3):
            print("正在跳舞...%d"%i)
            sleep(1)
    if __name__ == "__main__":
        print('---开始---')
        #主线程会等待所有子线程结束才结束
        t1 = threading.Thread(target = sing)
        t2 = threading.Thread(target = dance)
    
        t1.start()
        t2.start()
        print("---结束---")
    

    类方法

    1个线程执行

    #单线程执行
    import threading
    import time
    class MyThread(threading.Thread):
        def run(self):
            for i in range(3):
                time.sleep(1)
                msg = "线程名字:%s,%s"%(self.name,i)
                print(msg)
    if __name__ == "__main__":
        t = MyThread()
        t.start()
    

    5个线程执行执行一个方法

    import threading
    import time
    
    class MyThread(threading.Thread):
        def run(self):
            for i in range(5):
                msg = "线程名字:%s,%s"%(self.name,i)
                print(msg)
    def test():
        for i in range(5):
            t = MyThread()
            t.start()
    if __name__ == "__main__":
        test()
    

    多进程全局变量不共享
    多线程全局变量是共享的

    互斥锁
    创建锁:mutex = threading.Lock()
    锁定:mutex.acquire([blocking])
    释放:mutex.release()
    其中,锁定发放acquire可以有一个blocking参数

    • 如果设定blocking为True,则当前线程堵塞,直到获取到这个锁为止(如果没有指定,那么默认为True)
    • 如果设定blocking为False,则当前线程不会堵塞

    互斥锁代码:

    from threading import Thread,Lock
    import time
    
    g_num = 0
    def work1():
        global g_num
        #这个线程和work2线程都在抢着,如果有一方成功的上锁
        #那么导致另外一方会堵塞(一直等待)到这个锁被解开为止
        #上锁
        mutex.acquire()
        for i in range(1000000):
            g_num += 1
        #执行完上面代码解锁
        mutex.release()
        print("work1:%d"%g_num)
    def work2():
        global g_num
        #上锁
        mutex.acquire()
        for i in range(1000000):
            g_num += 1
        #解锁
        mutex.release()
        print("work2:%d"%g_num)
    #创建一把互斥锁
    mutex = Lock()
    if __name__ == "__main__":
        t1 = Thread(target=work1)
        t2 = Thread(target=work2)
        t1.start()
        t2.start()
    

    锁的好处:
    确保了某段关键代码只能由一个线程从头到尾完整地执行
    锁得坏处:
    1.阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了
    2.由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁

    相关文章

      网友评论

          本文标题:线程

          本文链接:https://www.haomeiwen.com/subject/qcbocqtx.html