ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python-day39(正式学习)

2019-09-18 19:56:15  阅读:263  来源: 互联网

标签:Thread day39 python 学习 release 线程 l1 print l2


目录

线程锁

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个任务执行的时间+开进程的时间

标签:Thread,day39,python,学习,release,线程,l1,print,l2
来源: https://www.cnblogs.com/leaf-wind/p/11544727.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有