Python编程 多线程和互斥锁
【摘要】 所属的课程名称及链接[AI基础课程--Python编程知识]环境信息 ModelArts Notebook - Multi-Engine 1.0 (python3)-cpu | CPU JupyterLab - Notebook - Conda-python3多线程import threadingfrom time import sleepdef work_a(): for...
所属的课程名称及链接
环境信息
- ModelArts
- Notebook - Multi-Engine 1.0 (python3)-cpu | CPU
- JupyterLab - Notebook - Conda-python3
- Notebook - Multi-Engine 1.0 (python3)-cpu | CPU
多线程
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. 沙箱实验、认证、论坛和直播,其中包含了许多优质的内容,推荐了解与学习。
2. 欢迎各位同学一起来交流学习心得^_^
3. 沙箱实验、认证、论坛和直播,其中包含了许多优质的内容,推荐了解与学习。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)