Python编程 多线程和互斥锁

举报
千江有水千江月 发表于 2020/12/23 23:34:07 2020/12/23
【摘要】 所属的课程名称及链接[AI基础课程--Python编程知识]环境信息 ModelArts   Notebook - Multi-Engine 1.0 (python3)-cpu | CPU     JupyterLab - Notebook - Conda-python3多线程import threadingfrom time import sleepdef work_a():    for...

所属的课程名称及链接

[AI基础课程--Python编程知识]


环境信息

  •  ModelArts
    •    Notebook - Multi-Engine 1.0 (python3)-cpu | CPU
      •      JupyterLab - Notebook - Conda-python3


多线程

import threading
from time import sleep

def work_a():
    for i in range(10):
        print("work_a正在执行",i)
        sleep(1)

def work_b():
    for i in range(10):
        print("work_b正在执行",i)
        sleep(1)

def work_c():
    for i in range(10):
        print("work_c正在执行",i)
        sleep(1)

t_a = threading.Thread(target=work_a)
t_b = threading.Thread(target=work_b)
t_c = threading.Thread(target=work_c)

t_a.start()
t_b.start()
t_c.start()
work_a正在执行 0
work_b正在执行 0
work_c正在执行 0
work_a正在执行 1
work_c正在执行work_b正在执行 1
 1
work_a正在执行work_c正在执行 2
 2
work_b正在执行 2
work_a正在执行work_c正在执行 3
 3
work_b正在执行 3
work_a正在执行work_c正在执行 4
 4
work_b正在执行 4
work_c正在执行 5
work_a正在执行 5
work_b正在执行 5
work_c正在执行 6
work_a正在执行 6
work_b正在执行 6
work_b正在执行 7
work_c正在执行 7
work_a正在执行 7
work_b正在执行 8
work_c正在执行 8
work_a正在执行 8
work_b正在执行 9
work_c正在执行 9
work_a正在执行 9



互斥锁

# 无互斥锁
import threading
import time

g_num = 0

def work_a(count:int):
    global g_num
    for i in range(count):
        g_num = g_num + 1

def work_b(count:int):
    global g_num
    for i in range(count):
        g_num = g_num + 1

def work_c(count:int):
    global g_num
    for i in range(count):
        g_num = g_num + 1

# count = 10000 能得到 30000
# count = 100000 也出现了 300000,但是有时会出现 228899 等数字
count = 1000000 # 这个尝试了许多次,还没有出现 3000000
t_a = threading.Thread(target=work_a,args=(count,))
t_b = threading.Thread(target=work_b,args=(count,))
t_c = threading.Thread(target=work_c,args=(count,))

t_a.start()
t_b.start()
t_c.start()

while True:
    if t_a.is_alive() or t_b.is_alive() or t_c.is_alive():
        time.sleep(3)
        print("time.sleep(3)")
        continue
    else:
        break

print(g_num)
time.sleep(3)
2238889




# 有互斥锁
import threading
import time

g_num = 0

def work_a(count:int):
    global g_num
    for i in range(count):
        mutex.acquire()
        g_num = g_num + 1
        mutex.release()
    print("work_a",g_num)
    
def work_b(count:int):
    global g_num
    for i in range(count):
        mutex.acquire()
        g_num = g_num + 1
        mutex.release()
    print("work_b",g_num)

def work_c(count:int):
    global g_num
    for i in range(count):
        mutex.acquire()
        g_num = g_num + 1
        mutex.release()
    print("work_c",g_num)
        
count = 1000000 # 加了互斥锁后,就可以加到 3000000
t_a = threading.Thread(target=work_a,args=(count,))
t_b = threading.Thread(target=work_b,args=(count,))
t_c = threading.Thread(target=work_c,args=(count,))

# 互斥锁
mutex = threading.Lock()

t_a.start()
t_b.start()
t_c.start()

while True:
    if t_a.is_alive() or t_b.is_alive() or t_c.is_alive():
        time.sleep(3)
        print("time.sleep(3)")
        continue
    else:
        break

print(g_num)
time.sleep(3)
time.sleep(3)
time.sleep(3)
time.sleep(3)
time.sleep(3)
time.sleep(3)
work_a 2931411
time.sleep(3)
work_c 2990093
work_b 3000000
time.sleep(3)
3000000


备注

1. 感谢老师的教学与课件  
2. 欢迎各位同学一起来交流学习心得^_^  
3. 沙箱实验、认证、论坛和直播,其中包含了许多优质的内容,推荐了解与学习。  


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。