python之多线程原理

并发

并发:逻辑上具备同时处理多个任务的能力。
并行:物理上在同一时刻执行多个并发任务。

举例:开个QQ,开了一个进程,开了微信,开了一个进程。在QQ这个进程里面,传输文字开一个线程、传输语音开了一个线程、弹出对话框又开了一个线程。
总结:开一个软件,相当于开了一个进程。在这个软件运行的过程里,多个工作同时运转,完成了QQ的运行,那么这个多个工作分别有多个线程。


线程与进程之间的关系

线程和进程之间的区别:


image.png

1.多线程-几个基本概念的了解

进程在python中的使用,对模块threading进行操作,调用的这个三方库。可以通过help(threading)了解其中的方法、变量使用情况。也可以使用dir(threading)查看目录结构。

  • 多线程使用的几个概念:
    r_synchronization=threading.Lock()#同步锁
    r_synchronization.acquire()#调用变量r_synchronization进行上锁,用于业务开始之前先对操作进行上锁操作
    r_synchronization.release()#调用变量r_synchronization解锁,用于业务结束之前对操作进行解锁操作
#递归锁,与同步锁的操作方法保持一致。
r_recursion.acquire() #上锁
r_recursion.release() #解锁
r_recursion=threading.RLock #递归锁
current_thread_n = threading.current_thread()  # 返回当前线程

current_thread_num = threading.active_count()# 返回正在运行的线程数量
run_thread_len = len(threading.enumerate())# 返回正在运行的线程数量
run_thread_list = threading.enumerate() # 返回当前运行线程的列表
t1=threading.Thread(target=dance)#创建两个子线程,参数传递为函数名
t1.setDaemon(True)# 设置守护进程,守护进程:主线程结束时自动退出子线程。
t1.start()# 启动子线程
t1.join()# 等待进程结束exit()`# 主线程退出,t1子线程设置了守护进程,会自动退出。其他子线程会继续执行。

2.实例-几个概念的使用

import threading,time
def dance():
    for i in range(5):
        print('我在唱歌')
        time.sleep(1)

def wu():
    for i in range(5):
        print('我在跳舞')
        time.sleep(0.5)

if __name__=='__main__':
    #创建两个子线程,参数传递为函数名
    t1 = threading.Thread(target=dance)
    t2 = threading.Thread(target=wu)
    #设置守护进程,守护进程:主线程结束时自动退出子线程。
    t1.setDaemon(True)
    #启动子线程
    t1.start()
    t2.start()
    #等待进程结束
    t1.join()
    t2.join()
    print('over')
    #主线程退出,t1子线程设置了守护进程,会自动退出。t2子线程会继续执行。
    exit()
    current_thread_n= threading.current_thread()  # 返回当前线程
    # 返回正在运行的线程数量
    current_thread_num=threading.active_count()
    run_thread_len=len(threading.enumerate())
    run_thread_list=threading.enumerate()  # 返回当前运行线程的列表

3.不安全的并发-同步锁

  • 场景:2件事情都需要操作一个变量,几乎同时发生,这个时候,显然并发操作是不安全的。
  • 解决方案:上锁(有2种方法:threading.Lock()-同步锁、threading.RLock()-递归锁)
import threading,time
account_account =500 #银行账号500元
r =threading.Lock() #一把锁,同步锁

#操作一个银行账号
def foo(num):
    r.acquire() #上锁
    global account_account #申明全局变量的引用
    balance =account_account #通过接口调用到账号
    time.sleep(1)
    balance = balance+num
    account_account =balance #计算结束,要将结果存回数据库或者通过接口返回新的余额。
    r.release() #解锁
t1 =threading.Thread(target=foo,args=(10000,)) #收入
t2 =threading.Thread(target=foo,args=(-200,))#把钱发出去
#启动线程
t1.start()
t2.start()
t1.join()
t2.join()
print('最终余额:',account_account)

4.不安全的并发-递归锁

#递归锁
import time,threading
# lockA =threading.Lock() #面试人员的锁
# lockB = threading.Lock() #小红的锁
r =threading.RLock() #递归锁
def foo1():
    r.acquire()#上锁
    print('请解释什么是死锁')
    time.sleep(1)

    r.acquire() #上锁
    print('发offer')

    #解锁
    r.release()
    r.release()

def foo2():
    r.acquire()
    print('请给我offer')
    time.sleep(1)

    r.acquire()
    print('向面试官解释什么是死锁')
    time.sleep(1)

    r.release()
    r.release()

t1 =threading.Thread(target=foo1) #收入
t2 =threading.Thread(target=foo2)#把钱发出去

t1.start()
t2.start()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容

  • 本篇主要讲的是多线程和多进程的一些基础知识,包括并发、并行、进程、线程相关概念以及线程的创建与调用、阻塞线程和守护...
    筱媛媛阅读 736评论 4 16
  • 多进程之间不共享数据,程序上下文区分开。 多线程之间共享数据,在数据处理上要谨慎 1.定义 程序: 只是一组指令的...
    SkTj阅读 4,116评论 0 2
  • 以前我们接触的都是单线程单进程的python编程方式,从今天开始我们开始接触多线程和多进程的开发模式。首先多线程就...
    He阅读 217评论 0 1
  • 1.进程与线程的概念 一个进程管理多个线程,进程是爹妈,管着众多的线程儿子.开一个QQ,开了一个进程.开了迅雷,开...
    Explorer_Mi阅读 189评论 1 0
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,562评论 0 11