26 python 初学(线程、同步锁、死锁和递归锁)

参考博客: 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()

原文地址:https://www.cnblogs.com/mlllily/p/10336543.html

时间: 2024-11-02 16:26:14

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

11.python并发入门(part4 死锁与递归锁)

一.关于死锁. 死锁,就是当多个进程或者线程在执行的过程中,因争夺共享资源而造成的一种互相等待的现象,一旦产生了死锁,不加人工处理,程序会一直等待下去,这也被称为死锁进程. 下面是一个产生"死锁"现象的例子: import threading import time lock_a = threading.Lock() lock_b = threading.Lock() class test_thread(threading.Thread): def __init__(self): su

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

一.GIL全局解释器锁 1.引子 在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念. 就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码.>有名的编译器例如GCC,INTEL C++,Visual C++等.Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行

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

什么是线程 进程:资源分配单位 线程:cpu执行单位(实体),每一个py文件中就是一个进程,一个进程中至少有一个线程 线程的两种创建方式: 一 from multiprocessing import Process def f1(n): print(n,'号线程') if __name__ == '__main__': t1 = Thread(target=f1,args=(1,)) t1.start() print('主线程')  二 from threading import Thread

python开发线程:死锁和递归锁&信号量&定时器&线程queue&事件evevt

一 死锁现象与递归锁 进程也有死锁与递归锁,在进程那里忘记说了,放到这里一切说了额 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁 from threading import Thread,Lock import time mutexA=Lock() mutexB=Lock() class MyThread(Thread):

线程同步锁、死锁、递归锁、信号量、GIL

目录 线程同步锁.死锁.递归锁.信号量.GIL 一.同步锁 二.死锁 三.递归锁(Rlock) 四.信号量(Semphare) 五.GIL(全局解释器锁) io密集型 计算密集型 线程同步锁.死锁.递归锁.信号量.GIL 一.同步锁 所有线程同一时间读写同一个数据,有的线程已经对数据进行修改了,造成有的线程拿到的数据时旧的数据,而不是修改后的数据,造成结果不正确,于是引入了同步锁解决问题, 同步锁的原理是同一时间只能有一个线程读写数据. 锁通常被用来实现对共享资源的同步访问.从threading

Linux程序设计学习笔记----多线程编程线程同步机制之互斥量(锁)与读写锁

互斥锁通信机制 基本原理 互斥锁以排他方式防止共享数据被并发访问,互斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个互斥锁逻辑上绑定之后,对该资源的访问操作如下: (1)在访问该资源之前需要首先申请互斥锁,如果锁处于开状态,则申请得到锁并立即上锁(关),防止其他进程访问资源,如果锁处于关,则默认阻塞等待. (2)只有锁定该互斥锁的进程才能释放该互斥锁. 互斥量类型声明为pthread_mutex_t数据类型,在<bits/pthreadtypes.h>中有具体的定义. 互斥量

Python学习【第24篇】:死锁,递归锁,信号量,Event事件,线程Queue

python并发编程之多线程2------------死锁与递归锁,信号量等 一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程, 如下就是死锁 1 死锁------------------- 2 from threading import Thread,Lock,RLock 3 import tim

python全栈开发基础【第二十五篇】死锁,递归锁,信号量,Event事件,线程Queue

一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程, 如下就是死锁 #死锁现象 死锁------------------- from threading import Thread,Lock,RLock import time mutexA = Lock() mutexB = Lock() class

多线程——线程同步,死锁

线程同步: 为什么需要同步 ①   线程同步是为了防止多个线程访问一个数据对象时,对数据造成破坏. ②   线程的同步是保证多线程安全访问竞争资源的一种手段. 同步和锁 ①   Java中每一个对象都有一个内置锁. ②   当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁:当程序运行到synchronized同步代码块时,自动获得锁定对象的锁. ③   获得一个对象的锁也称为获取锁.锁定对象.在对象上锁定或在对象上同步.当程序运