线程

2018-12-06  本文已影响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.由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁

上一篇下一篇

猜你喜欢

热点阅读