守护进程,互斥锁,死锁现象以及信号量

1 守护线程
from threading import Thread,current_thread
import time

def task():
    print('%s is running' % current_thread().name)
    time.sleep(3)
    print('%s is done' % current_thread().name)

if __name__ == '__main__':
    t1=Thread(target=task,name='第一个线程')
    t1.daemon = True
    t1.start()
    # time.sleep(5)
    t1.join()


print('主线程')
守护线程基本方式

多个子线程的守护线程
from threading import Thread
import time
def foo():
    print(123)
    time.sleep(5)
    print("end123")

def bar():
    print(456)
    time.sleep(3)
    print("end456")

if __name__ == '__main__':

    t1=Thread(target=foo)
    t2=Thread(target=bar)

    t1.daemon=True
    t1.start()
    t2.start()
    print("main-------")
多个子线程守护线程

总结:

主进程:执行完代码就结束。
主线程:所有子线程结束才结束。
总结:只要进程内没有可执行的代码守护就结束。

2 互斥锁

注意一点:线程互斥锁可以放在全局名称空间,因为他们在同一个进程内,共享资源。
from threading import Thread,Lock
import time

mutex=Lock()
x=100

def task():
    global x
    mutex.acquire()
    temp=x
    time.sleep(0.1)
    x=temp-1
    mutex.release()

if __name__ == '__main__':
    start=time.time()
    t_l=[]
    for i in range(100):
        t=Thread(target=task)
        t_l.append(t)
        t.start()
    for t in t_l:
        t.join()

    print('',x)    #0
print(time.time()-start)
线程互斥锁

3 死锁现象及解决方案 ——》递归锁
注意点:mutex=Rlock 可以连续acquire,但只有其引用计数为0,其他线程才可以使用。
from threading import Thread,Lock,RLock
import time

# mutexA=Lock()  #如果用Lock(互斥锁),会发生死锁现象
# mutexB=Lock()

mutexA=mutexB=RLock()  #是一把锁,可连续acqruie,但只有其上的计数为0时其他线程才可对其调用

class MyThread(Thread):
    def run(self):
        self.f1()
        self.f2()

    def f1(self):
        mutexA.acquire()
        print('%s 拿到了A锁' %self.name)

        mutexB.acquire()
        print('%s 拿到了B锁' %self.name)
        mutexB.release()

        mutexA.release()

    def f2(self):
        mutexB.acquire()
        print('%s 拿到了B锁' %self.name)
        time.sleep(0.1)

        mutexA.acquire()
        print('%s 拿到了A锁' %self.name)
        mutexA.release()

        mutexB.release()


if __name__ == '__main__':
    for i in range(10):
        t=MyThread()
        t.start()

print('')
死锁现象和递归锁

4 信号量

# from multiprocessing import Semaphore #进程和线程中皆可导入Semaphore模块
from threading import Thread,Semaphore,current_thread
import time,random

sm=Semaphore(5)  #5把钥匙,即同时可以5个对象进行执行

def go_wc():
    sm.acquire()
    print('%s 上厕所ing' %current_thread().getName())
    time.sleep(random.randint(1,3))
    sm.release()

if __name__ == '__main__':
    for i in range(23):
        t=Thread(target=go_wc)
        t.start()
信号量

 

posted @ 2018-07-13 16:49  Roc_Atlantis  阅读(221)  评论(0编辑  收藏  举报