参考博客: www.cnblogs.com/yuanchenqi/articles/5733873.html

并发:一段时间内做一些事情

并行:同时做多件事情

线程是操作系统能够进行运算调度的基本单位,一个线程就是一个指令集

IO 密集型任务或函数  计算密集型任务函数

t1 = threading.Thread( target=foo, args=( , ))

t1.start()

# _author: lily
# _date: 2019/1/29 import threading
import time class MyThread(threading.Thread):
def __init__(self, num):
threading.Thread.__init__(self)
self.num = num def run(self): # 定义每个线程要运行的函数
print('running on number %s' % self.num)
time.sleep(3) if __name__ == '__main__':
t1 = MyThread(1)
t2 = MyThread(2)
t1.start()
t2.start()
# _author: lily
# _date: 2019/1/28 import threading
import time def music(func):
for i in range(2):
print('listening to music %s.%s' % (func, time.ctime()))
time.sleep(1)
print('end listening %s' % time.ctime()) def move(func):
for i in range(2):
print('watching at the %s.%s' % (func, time.ctime()))
time.sleep(5)
print('end watching %s' % time.ctime()) threads = []
t1 = threading.Thread(target=music, args=('七里香', ))
threads.append(t1)
t2 = threading.Thread(target=move, args=('阿甘正传', ))
threads.append(t2)
if __name__ == '__main__':
for t in threads:
t.start()
print('all over %s' % time.ctime())

GIL: 全局解释器锁。 对于一个进程,在同一时刻,python解释器中只允许一个线程运行。

结论:在 python里,如果是 io 密集型,可以用多线程

计算密集型,改 C。

守护线程: t.setDaemon(True)  当主线程结束之后就认为程序执行完毕,不会等待 t 线程执行完毕。

得到当前线程:  print(threading.current_thread())

得到当前活着的线程: print(threading.active_count())

同步锁:

原因:1. 线程共享同一资源,且进行 IO 阻塞时,对资源的操作容易被覆盖

  1. 使用 join 就会造成船串行,失去了多线程的意义

使用:r = threading.Lock()

同步锁与GIL关系:

没有GIL ,使用同步锁,可以达到一样得效果。

# _author: lily
# _date: 2019/1/29 import time
import threading num = 100 def add():
global num
# num -= 1 r.acquire()
temp = num
# time.sleep(0.0000001)
print('ok')
num = temp - 1
r.release() thread_list = [] r = threading.Lock()
for i in range(100):
t = threading.Thread(target=add)
t.start()
thread_list.append(t) for thd in thread_list:
thd.join() print('final num: ', num)

线程死锁和递归锁:

lock = threading.Lock()

lock = threading.RLock()

# _author: lily
# _date: 2019/1/29
import threading
import time class MyThread(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name def run(self):
self.do_a()
self.do_b() def do_a(self):
# lock_a.acquire()
my_lock.acquire()
print('do_a: thread %s get lock A' % self.name)
time.sleep(3)
my_lock.acquire()
print('do_a: thread %s get lock B' % self.name)
# lock_b.release()
# lock_a.release()
my_lock.release()
my_lock.release() def do_b(self):
# lock_b.acquire()
my_lock.acquire()
print('do_b: thread %s get lock B' % self.name)
time.sleep(2)
# lock_a.acquire()
my_lock.acquire()
print('do_b: thread %s get lock A' % self.name)
# lock_a.release()
# lock_b.release()
my_lock.release()
my_lock.release() # lock_a = threading.Lock()
# lock_b = threading.Lock()
my_lock = threading.RLock()
thread_list = [] for i in range(5):
t = MyThread(i)
thread_list.append(t)
t.start() for t in thread_list:
t.join()

26 python 初学(线程、同步锁、死锁和递归锁)的更多相关文章

  1. Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures

    参考博客: https://www.cnblogs.com/xiao987334176/p/9046028.html 线程简述 什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线 ...

  2. python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)

    昨日内容回顾 线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...

  3. python并发编程之线程(二):死锁和递归锁&信号量&定时器&线程queue&事件evevt

    一 死锁现象与递归锁 进程也有死锁与递归锁,在进程那里忘记说了,放到这里一切说了额 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将 ...

  4. 同步锁 死锁与递归锁 信号量 线程queue event事件

    二个需要注意的点: 1 线程抢的是GIL锁,GIL锁相当于执行权限,拿到执行权限后才能拿到互斥锁Lock,其他线程也可以抢到GIL,但如果发现Lock任然没有被释放则阻塞,即便是拿到执行权限GIL也要 ...

  5. 10 并发编程-(线程)-GIL全局解释器锁&死锁与递归锁

    一.GIL全局解释器锁 1.引子 在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势 首先需要明确的一点是GIL并不是Python的特性,它是在实现Pyt ...

  6. GIL全局解释器锁-死锁与递归锁-信号量-event事件

    一.全局解释器锁GIL: 官方的解释:掌握概念为主 """ In CPython, the global interpreter lock, or GIL, is a m ...

  7. Python之网路编程之死锁,递归锁,信号量,Event事件,线程Queue

    一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 它们都将无法推进下去.此时称系统处于死锁状态或系统 ...

  8. python并发编程之线程(创建线程,锁(死锁现象,递归锁),GIL锁)

    什么是线程 进程:资源分配单位 线程:cpu执行单位(实体),每一个py文件中就是一个进程,一个进程中至少有一个线程 线程的两种创建方式: 一 from threading import Thread ...

  9. day 33 什么是线程? 两种创建方式. 守护线程. 锁. 死锁现象. 递归锁. GIL锁

    一.线程     1.进程:资源的分配单位    线程:cpu执行单位(实体) 2.线程的创建和销毁开销特别小 3.线程之间资源共享,共享的是同一个进程中的资源 4.线程之间不是隔离的 5.线程可不需 ...

随机推荐

  1. Chapter 5 Blood Type——25

    "I usually am — but about what in particular this time?" “我通常都是 —— 但是这次有什么特殊的吗?” "Dit ...

  2. Chapter 5 Blood Type——11

    "I just wondered… if you could warn me beforehand the next time you decide to ignore me for my ...

  3. javaweb请求编码 url编码 响应编码 乱码问题 post编码 get请求编码 中文乱码问题 GET POST参数乱码问题 url乱码问题 get post请求乱码 字符编码

     乱码是一个经常出现的问题 请求中,参数传递的过程中也是经常出现乱码的问题 本文主要整理了请求乱码中的问题以及解决思路   先要理解一个概念前提: 编码就是把图形变成数值码所以说: 图形的字符  -- ...

  4. 【Go】string 优化误区及建议

    原文链接: https://blog.thinkeridea.com/201902/go/string_ye_shi_yin_yong_lei_xing.html 本文原标题为 <string ...

  5. Request.Params

    在开发中有时会用到Request.Params["id"]来获取参数,那么到底是从什么地方接收参数呢? 一般情况下,有三种方式进行参数传递1.GET 方式,通过url传递,如?id ...

  6. [Linux] scp本地服务器和远程服务器拷贝文件

    上传本地文件到服务器scp 本地路径 用户名@远程服务器ip:远程路径 下载文件 scp 用户名@远程服务器ip:远程路径 本地路径-r 是上传下载本地目录到远程 远程文件

  7. C-sizeof和strlen区别,以及sizeof如何计算结构体大小

    sizeof和strlen区别 sizeof是关键字,在编译时就能计算出值,可以计算任何类型 strlen是函数,只有在运行时才能去计算,且只能计算字符型的. 对于数组时,strlen是判断’\0’为 ...

  8. .NET平台下使用MongoDB入门教程

    适合人群:完全没有接触MongoDB或对MongoDB有一点了解的C#开发人员.因为本文是一篇入门级的文章. 一.了解MongoDB  MongoDB是一个基于分布式文件存储的数据库.由C++语言编写 ...

  9. i的二次幂求和

    \(i^2\)求和 老祖宗告诉我们\(\sum_{i=1}^n i^2 = \frac{n(n+1)(2n+1)}{6}\) 但是这玩意儿是怎么出来的呢?感觉网上用立方差证明的思路太low了,今天偶然 ...

  10. 网络最大流算法—最高标号预流推进HLPP

    吐槽 这个算法.. 怎么说........ 学来也就是装装13吧.... 长得比EK丑 跑的比EK慢 写着比EK难 思想 大家先来猜一下这个算法的思想吧:joy: 看看人家的名字——最高标号预留推进 ...