线程锁

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

python-day39(正式学习)的更多相关文章

  1. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  2. Requests:Python HTTP Module学习笔记(一)(转)

    Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...

  3. 从Theano到Lasagne:基于Python的深度学习的框架和库

    从Theano到Lasagne:基于Python的深度学习的框架和库 摘要:最近,深度神经网络以“Deep Dreams”形式在网站中如雨后春笋般出现,或是像谷歌研究原创论文中描述的那样:Incept ...

  4. Comprehensive learning path – Data Science in Python深入学习路径-使用python数据中学习

    http://blog.csdn.net/pipisorry/article/details/44245575 关于怎么学习python,并将python用于数据科学.数据分析.机器学习中的一篇非常好 ...

  5. (转载)Python装饰器学习

    转载出处:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方 ...

  6. 正式学习React(五) react-redux源码分析

    磨刀不误砍柴工,咱先把react-redux里的工具函数分析一下: 源码点这里  shallowEqual.js export default function shallowEqual(objA, ...

  7. 正式学习React(一) 开始学习之前必读

    为什么要加这个必读!因为webpack本身是基于node环境的, 里面会涉及很多路径问题,我们可能对paths怎么写!webpack又是怎么找到这些paths的很迷惑. 本文是我已经写完正式学习Rea ...

  8. python网络爬虫学习笔记

    python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...

  9. Python装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 ? 1 2 3 4 5 6 7 8 # -*- ...

  10. Python的基础学习(第二周)

    模块初始 sys模块 import sys sys.path #打印环境变量 sys.argv#打印该文件路径 #注意:该文件名字不能跟导入模块名字相同 os模块 import os cmd_res ...

随机推荐

  1. Work Queues(工作队列)

    1.模型 2.创建生产者 package com.dwz.rabbitmq.work; import java.io.IOException; import java.util.concurrent. ...

  2. 设置PyCharm中选择文本的背景颜色和代码中和选中单词相同单词的背景颜色

    1 设置选中单词的背景颜色 首先进入File->Setting->Editor->Color Scheme后复制一个存在的颜色主题作为自定义的颜色主题(默认的颜色主题是无法修改的,也 ...

  3. Zjoi2011看电影(movie)

    第一步,打表找规律,发现自己的表连3的小样例都过不去,还不如自己手模,自己手跑了5以下的样例,然后发现毫无规律可言…… 第二步,想出一种错误做法,首先n>k必零,人比座都多……然后粘一下图: 基 ...

  4. TCP时间戳选项Timestamp

    时间戳选项发送方在每个报文段中放置一个时间戳值.接收方在确认中返回这个数值,从而允许发送方为每一个收到的ACK计算RTT(我们必须说“每一个收到的ACK”而不是“每一个收到的报文段”,是因为TCP通常 ...

  5. MySQL如何查询某个字段长度最大的记录

    转: MySQL如何查询某个字段长度最大的记录 2017年06月24日 13:12:15 翔云123456 阅读数 18348   版权声明:本文为翔云原创文章,未经博主允许不得转载. https:/ ...

  6. 手动集成 Ironic 裸金属管理服务(Rocky)

    目录 文章目录 目录 前文列表 横向扩展裸金属管理服务节点 配置基础设施 安装 Ironic(BareMetal) 安装 Nova Compute(BareMetal) 配置 Neutron 提供 P ...

  7. 转:extjs 添加loading状态的三种解决办法:

    extjs 添加loading状态的三种解决办法: 方法一: //materialGrid 指需要显示loading状态的控件id var o=Ext.getCmp('materialGrid'); ...

  8. vue中html、js、vue文件之间的简单引用与关系

    有关vue文件记录:index.html在html中运用组件 <body> <app></app> <!-- 此处app的组件为入口js main.js中定义 ...

  9. ABAP 判断字符串是否是数字

    通过正则表达式: IF cl_abap_matcher=>matches( pattern = '^(-?[1-9]\d*(\.\d*[1-9])?)|(-?0\.\d*[1-9])$' tex ...

  10. python分布式进程

    分布式进程指的是将Process进程分布到多台机器上,充分利用多态机器的性能完成复杂的任务 分布式进程在python 中依然要用到multiprocessing 模块.multiprocessing模 ...