python-day39(正式学习)

线程锁

from threading import Thread,Lock

x=0
lock=Lock()
def test():
    lock.acquire()		#锁住不让cpu切换
    global x
    for i in range(111100):
        x+=1
    lock.release()
t=Thread(target=test)
t1=Thread(target=test)
t2=Thread(target=test)
t.start()
t1.start()
t2.start()
t.join()
t1.join()
t2.join()
print(x)

死锁问题及递归锁

死锁

被其他线程占用了锁头导致线程阻塞

from threading import Thread,Lock
import time
l1=Lock()
l2=Lock()
def test1():
    l1.acquire()
    print('one1suo')
    time.sleep(1)
    l2.acquire()
    print('one2suo')
    l1.release()
    print('one1fang')
    l2.release()
    print('one2fang')
def test2():
    l2.acquire()
    print('two2suo')
    l1.acquire()
    print('two1suo')
    l2.release()
    print('two2fang')
    l1.release()
    print('two1fang')

t=Thread(target=test1)
t1=Thread(target=test2)
t.start()
t1.start()

递归锁

同一个锁可多次使用acquier()和release()

from threading import Thread,RLock,Lock
import time
l1=RLock()
l2=l1
def test1():
    l1.acquire()
    print('one1suo')
    time.sleep(1)
    l2.acquire()
    print('one2suo')
    l1.release()
    print('one1fang')
    l2.release()
    print('one2fang')
def test2():
    l2.acquire()
    print('two2suo')
    l1.acquire()
    print('two1suo')
    l2.release()
    print('two2fang')
    l1.release()
    print('two1fang')

t=Thread(target=test1)
t1=Thread(target=test2)
t.start()
t1.start()

信号量

from threading import Thread,RLock,Lock,Semaphore
import time

def test1():
    s.acquire()
    print('nice')
    time.sleep(1)
    s.release()
s=Semaphore(5)
for i in range(15):
    t = Thread(target=test1)
    t.start()

GIL全局解释器锁

# 在Cpython解释器中有一把GIL锁(全局解释器锁),GIl锁本质是一把互斥锁。
# 导致了同一个进程下,同一时间只能运行一个线程,无法利用多核优势.
# 同一个进程下多个线程只能实现并发不能实现并行.

# 为什么要有GIL?
# 因为cpython自带的垃圾回收机制不是线程安全的,所以要有GIL锁.

# 导致了同一个进程下,同一时间只能运行一个线程,无法利用多核优势.
#
#分析:
# 我们有四个任务需要处理,处理方式肯定是要玩出并发的效果,解决方案可以是:
# 方案一:开启四个进程
# 方案二:一个进程下,开启四个线程

# 计算密集型 推荐使用多进程
#  每个都要计算10s
#  多线程
#  在同一时刻只有一个线程会被执行,也就意味着每个10s都不能省,分开每个都要计算10s,共40.ns
#  多进程
#  可以并行的执行多个线程,10s+开启进程的时间

# io密集型 推荐多线程
# 4个任务每个任务90%大部分时间都在io.
# 每个任务io10s 0.5s
# 多线程
# 可以实现并发,每个线程io的时间不咋占用cpu, 10s + 4个任务的计算时间
# # 多进程
# 可以实现并行,10s+1个任务执行的时间+开进程的时间
posted @ 2019-09-18 19:45  wind叶  阅读(137)  评论(0编辑  收藏  举报